это правильный обработчик завершения? - PullRequest
0 голосов
/ 17 октября 2019

У меня был очень медленный нижний лист, который показывался пустым и затем через некоторое время загружал данные. Я пытался применить завершение Handler isLoadedCompletionHandler, решение работало, но мой коллега сказал мне, что это не «обработчик завершения». Не могли бы вы объяснить мне, почему это работает. И как? Это правильный обработчик завершения?

func buttonDetailTapped(with travelSolutionId: String) {
           guard let currentPurchaseSolution = purchaseSolutions.value.first(where: { $0.xmlId == purchaselSolutionId }) else {return}

           getAllPurchaseDetail(searchId: searchId.value, solutionId: purchaseSolutionId)
               .subscribe(onNext: { [weak self] purchaseDetails in
                   let isLoadedCompletionHandler: ([PurchaseDetail]) -> Void = { theArray in
                       self?.result.onNext(.showPurhcaseSolutionDetails(purchaseDetails, currentTravelSolution))
                   }
                   isLoadedCompletionHandler(purchaseDetails)
               })
               .disposed(by: disposeBag)
       }

Ответы [ 2 ]

0 голосов
/ 17 октября 2019

isLoadedCompletionHandler не является обработчиком завершения, потому что он вызывается сразу после его назначения.

Обработчик завершения - это замыкание, которое вы передаете в функцию, которая будет вызываться, когда бы ни выполнялась эта функциязавершается асинхронно. Вы нигде не проходите isLoadedCompletionHandler.

Вы могли просто написать

getAllPurchaseDetail(searchId: searchId.value, solutionId: purchaseSolutionId)
    .subscribe(onNext: { [weak self] purchaseDetails in
        self?.result.onNext(.showPurhcaseSolutionDetails(purchaseDetails, currentTravelSolution))
   })
   .disposed(by: disposeBag)

и достичь того же результата.

0 голосов
/ 17 октября 2019

Обработчик завершения - это функция, которую вы передаете в свою функцию, которая обычно вызывается после завершения некоторой асинхронной задачи.

Ваша функция buttonDetailTapped не содержит параметров, которые являются функциями (например, (Thing, Error) -> Void) которые вызываются после завершения , и поэтому вы не можете узнать, вызвав эту функцию , когда она завершит .

Ваша функция может идти вперед и делать другие вещи, когда онасделано, но обработчик завершения не существует.

...