我有一个使用MVP该Coordinator模式的应用程序。
当子协调器发送事件时,我希望AppCoordinator递归调用一个方法,该方法根据某些SessionState.
该应用程序的基本流程如下 -
AppCoordinator
start()coordinateToRoot以初始状态调用showStartScene()启动子协调器StartCoordinator
start()创建MVP现在对用户可见的模块MVP模块调用AuthSvc对 iDP 进行异步调用并确认身份验证状态AppCoordinator完成此任务后,发布一个事件,该事件由的方法中的订阅拾取coordinateToRoot,并使用视图状态的适当协调器重复该循环。然而问题是,在该事件发布后,什么也没有发生。start()没有显示它收到了事件并且coordinateToRoot不会再次被调用。
我在下面创建了最基本的版本来演示这一点。我还硬编码showStartScene为返回.signedIn而不是查找身份验证状态。
在下面的示例中,我希望一旦加载视图,presenter.signal应该立即发出一个导致打印语句显示的事件。
会话状态
enum SessionState: String {
case unknown, signedIn, signedOut
}
Run Code Online (Sandbox Code Playgroud)
应用程序协调员
final class AppCoordinator: BaseCoordinator<Void> {
private let window: UIWindow
init(window: UIWindow) {
self.window = window
}
override func start() -> Observable<Void> { …Run Code Online (Sandbox Code Playgroud) 我正在尝试构建一个演示器,该演示器在某个时间段内计算一些事件,仅在第一次加载时显示加载,并在完成时更新ui。因为可以通过多种方式(例如用户首选项)来更新事件,所以我需要能够告知演示者事件已更新,并且必须再次刷新它们。这是我现在所拥有的:
subject
.map<List<UpcomingRowViewModel>> {
provider.calculateEventsBetween(TimePeriod.aYearFrom(firstDay))
}
.doOnSubscribe {
view.showLoading()
}
.observeOn(resultScheduler)
.subscribeOn(workScheduler)
.subscribe { upcomingRowViewModels ->
view.display(upcomingRowViewModels)
}
subject.onNext(TRIGGER)
Run Code Online (Sandbox Code Playgroud)
主题是PublishSubjectInt。onNext()订阅后我会执行正确的操作,因为我希望在订阅数据后立即刷新数据。
上面的代码在我的单元测试中以及在仅在附有调试器的设备上运行时才起作用。如果我只是运行它(不使用任何调试器),它将到达该view.showLoading()部分,但是永远不会到达,provider.calculateEventsBetween(TimePeriod.aYearFrom(firstDay)因此UI会因加载而“卡住”。
有任何想法吗?
我正在使用 rxjava 2 并尝试使用 rxbus 传递值
接收总线代码
public class SeasonTabSelectorBus {
private static SeasonTabSelectorBus instance;
private PublishSubject<Object> subject = PublishSubject.create();
public static SeasonTabSelectorBus instanceOf() {
if (instance == null) {
instance = new SeasonTabSelectorBus();
}
return instance;
}
public void setTab(Object object) {
try {
subject.onNext(object);
subject.onComplete();
} catch (Exception e) {
e.printStackTrace();
}
}
public Observable<Object> getSelectedTab() {
return subject;
}
}
Run Code Online (Sandbox Code Playgroud)
我将值设置为
SeasonTabSelectorBus.instanceOf().setTab(20);
Run Code Online (Sandbox Code Playgroud)
这是我订阅的代码
SeasonTabSelectorBus.instanceOf().getSelectedTab().subscribe(new Observer<Object>(){
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Object o) …Run Code Online (Sandbox Code Playgroud)