1) При вызове:
.do {
print("1: \(Thread.current)")
}
вы собираетесь выполнить замыкание onDispose
, поэтому вам нужно передать его параметру onNext
, чтобы выполнить его, как только первая наблюдаемая испустит событие. (Это причина, по которой вы видите 2, 3, 1)
2) concat
оператор - это то, что вам нужно, если вам нужно дождаться завершения одной наблюдаемой, прежде чем выполнять следующую, так что ваш Foo.foo()
должен быть изменен, чтобы вернуть Observable.
Попробуйте этот код:
class Foo {
private let scheduler: SerialDispatchQueueScheduler
init() {
self.scheduler = SerialDispatchQueueScheduler(internalSerialQueueName: "")
foo().concat(foo()).subscribe()
}
private func foo() -> Observable<Int> {
return Observable<Void>.just(())
.subscribeOn(scheduler)
.do(onNext: {
print("1: \(Thread.current)")
})
.map { () -> Bool in
print("2: \(Thread.current)")
return true
}
.flatMap { (shouldLoad) -> Observable<Int> in
print("3: \(Thread.current)")
let observableThatSwitchesScheduler = secretObservable
.do(onNext: { _ in
print("4: \(Thread.current)")
})
return observableThatSwitchesScheduler
}
.do(onNext: { _ in
print("5: \(Thread.current)")
})
.observeOn(MainScheduler.instance)
}
}
Две причуды я нашел на форумах ежевики:
Единственный вопрос, о котором я могу думать, обсуждается в ответе на другой stackoverflow вопрос.
1.UI
User interface operations always need to run in the UI thread. To execute such functions like LabelField.setText("foo");
you need to do:
UiApplication.getUiApplication().invokeLater(new Runnable(){
public void run(){
myLabelField.setText("foo");
myLabelField.setDirty(true);
}
});
Pretty easy, huh?
2.Network Network operation should never run within the UI thread. To do such things do:
new Thread(){
public void run(){
HttpConnection hc =
(HttpConnection)Connector.open("http://www.stackoverflow.com");
}
}.start();
These two main principle are very important. You should always take care of in which thread you are operating.