Модель потоков BlackBerry

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)
    }
}
10
задан roryf 10 December 2008 в 14:42
поделиться

3 ответа

Две причуды я нашел на форумах ежевики:

  1. Вектор не ориентирован на многопотоковое исполнение.
  2. При создании собственной ягоды ежевики приложение CLDC помехи являются не обязательно одиночным элементом по VM.
2
ответ дан 3 December 2019 в 20:07
поделиться

Единственный вопрос, о котором я могу думать, обсуждается в ответе на другой stackoverflow вопрос.

0
ответ дан 3 December 2019 в 20:07
поделиться

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.

16
ответ дан 3 December 2019 в 20:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: