Использование наблюдений и подписок для решения проблемы зависания моего приложения

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

Это было трудно воспроизвести, но мое решение состояло в том, чтобы добавить подписку и наблюдение в мою пользовательскую функцию mapArray, которая связывается после запроса moya, но перед любым использованием пользовательского интерфейса.

Вопросы:

  • Имеет ли смысл эта последовательность вызовов Подписаться на и Наблюдение в качестве подхода к решению проблемы замораживания?
  • Мне кажется странным звонить на subscribeOn после вызова функции, но я не хочу заключать свой запрос в еще один блок отправки

В целом, я довольно смущен переключением потоков в Moya и Alamofire, и надеюсь, что кто-то может пролить немного света:

PS: я читал вопрос в моей, обсуждая это, и упоминает, что alamofire выполняет сетевой вызов в главном потоке, что также смущает меня

PS2: это решение также основано на этом посте в блоге, но мой вопрос, помимо вышеупомянутых, заключается в том, почему он может выступать за запуск сетевого вызова в фоновом потоке, когда это не так для парней из Мойя.

 // How the network call is 
 func load() -> Observable<Void> {
    let apiProvider: RxMoyaProvider()
    return apiProvider.request(.GetFeed(page: 1))
      .mapArray(Question.self, keyPath: "questions")
      .doOnNext { questions, pagination in
        // updates the results to a variable, which is bound to the UI
        self.pagination = pagination
        self.data.value = questions
      }
      .flatMapLatest { _ in
        Observable.just()
      }
  }

 // My observable extension, a function to map responses to a 
extension ObservableType where E == Response {

  func mapObject<T: Mappable>(type: T.Type, keyPath: String) -> Observable<T> {
    return
      // this makes sure that the beginning of the call is made on the background thread. but it can be changed later, so we need an observe on later on
      subscribeOn(ConcurrentDispatchQueueScheduler(globalConcurrentQueueQOS: .Background))
      .doOnError(networkFailureCallback)
      .filterSuccessfulStatusCodes()
      .handleUnauthorizedRequest()
        // this makes sure that the mapping happens on a background thread as well
      .observeOn(ConcurrentDispatchQueueScheduler(globalConcurrentQueueQOS: .Background))
      .flatMap { response -> Observable<T> in
        return Observable.just(try response.mapObject(T.self, keyPath: keyPath))
      }
  }
}


// In my viewController
dataAccessor.load()
  .observeOn(MainScheduler.instance)
  .subscribe { error in
    // do actions
  }
  .addDisposableTo(self.disposeBag)

0 ответов

Другие вопросы по тегам