Блокировка темы с помощью RxSwift - PullRequest
0 голосов
/ 25 февраля 2019

Ниже приведена упрощенная версия моего проекта, с которым я сейчас борюсь.

Я бы хотел заблокировать поток , пока первый Single не будет успешным.
Эти наблюдаемые значения должны быть двумя разделенными потоками, но с общим потоком .

Есть ли у вас идеи исправить этот код?Спасибо!

let disposeBag = DisposeBag()
var hasReturnedSingle = false

func returnSingle() -> Single<String> {
    return Single<String>.create { single in
      print("hasReturnedSingle: \(hasReturnedSingle)")

      DispatchQueue.main.asyncAfter(deadline: .now()+3.0) {
        single(.success(()))
        hasReturnedSingle = true
      }
      return Disposables.create()
    }
}

returnSingle().asObservable()
    .subscribeOn(MainScheduler.instance)
    .asSingle()
    .subscribe()
    .disposed(by: disposeBag)

returnSingle().asObservable()
    .subscribeOn(MainScheduler.instance)
    .asSingle()
    .subscribe()
    .disposed(by: disposeBag)

Результат:

hasReturnedSingle: false
hasReturnedSingle: false

Ожидание:

hasReturnedSingle: false
hasReturnedSingle: true

1 Ответ

0 голосов
/ 25 февраля 2019

Оператор subscribeOn влияет на поток, в котором производитель запускает , т. Е. Поток, в котором выполняется оператор печати, но не поток, в котором работает DispatchQueue.Таким образом, первый вызов печатается, помещает блок в основную очередь отправки и затем завершается.Затем второй звонок делает то же самое.Затем отправка запускается.

Вы можете решить проблему любым из нескольких способов в зависимости от того, насколько вы контролируете код в функции производителя:

  • writeфункция-производитель в последовательном формате вместо диспетчеризации.

  • передает планировщик в функцию returnSingle и затем использует его вместо DispatchQueue.

  • выполнить все операции для субъекта, а затем concatMap выбросов субъекта.

...