RXSwift Не подписываться на основную тему - PullRequest
3 голосов
/ 12 октября 2019

Я пытаюсь сделать несколько вызовов API и заполнить базу данных областей. Все отлично работаетОднако, когда я пытаюсь запустить метод performSegue() на subscribe(), возникает исключение, сообщающее, что я не могу сделать это в фоновом потоке, что вполне разумно.

Но так как я подписываюсь на MainScheduler.instance не должен ли метод subscribe() выполняться в потоке пользовательского интерфейса?

Single.zip(APIClient.shared.getSchools(), APIClient.shared.getPointsOfInterest())
        .observeOn(SerialDispatchQueueScheduler(qos: .background))
        .flatMap { zip in return Single.zip(SchoolDao.shared.insertSchools(schoolsJson: zip.0), PointOfInterestDao.shared.insertPointsOfInterest(poisJson: zip.1))}
        .flatMap{ _ in Single.zip(SchoolDao.shared.countSchools(), PointOfInterestDao.shared.countPointsOfInterest())}
        .subscribeOn(MainScheduler.instance)
        .subscribe(onSuccess: { tableCounts in
            let (schoolsCount, poisCount) = tableCounts
            if(schoolsCount != 0 && poisCount != 0){
                print(Thread.isMainThread) //Prints False
                self.performSegue(withIdentifier: "splashToLogin", sender: nil)
            }
        }, onError: {
            error in return
        }).disposed(by: disposeBag)

Не правильно ли я понимаю, как работает RXSwift?

Редактировать: Если я добавлю эту строку .observeOn(MainScheduler.instance) после .subscribeOn(MainScheduler.instance), метод подписки будет запущен в главном потоке. Это правильное поведение? Что .subscribeOn(MainScheduler.instance) даже делает?

1 Ответ

2 голосов
/ 13 октября 2019

Ваше редактирование объясняет все. Ваше первоначальное предположение о том, что подписка и наблюдение были задом наперед.

Оператор subscribeOn относится к тому, как самая первая наблюдаемая в цепочке подписывается на конечный источник событий (и, вероятно, не выполняет то, что вы думаете, в любом случае. Вероятно, установлены два сетевых вызова)свой собственный фоновый поток для выдачи значений независимо от того, как они подписаны.)

Оператор observeOn относится к планировщику, который будет отправлять элементы наблюдателю (который является блоком (ами)код, который передается оператору subscribe.

Вот отличная статья, объясняющая все это: http://rx -marin.com / post / наблюдаем-против-подписки /

...