这是一个适当的完成处理程序吗?

Posted

技术标签:

【中文标题】这是一个适当的完成处理程序吗?【英文标题】:is this a proper completion handler? 【发布时间】:2019-10-17 08:39:51 【问题描述】:

我有一个非常慢的底部工作表,在加载数据后显示为空白。我尝试应用completionHandler 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)
       

【问题讨论】:

当前显示的代码是您“尝试应用completionHandler”之后的代码,对吧?您可以在“尝试应用completionHandler”之前显示代码吗? 【参考方案1】:

完成处理程序是您传递给函数的函数,通常在完成某些异步任务时调用。

您的buttonDetailTapped 函数不包含函数参数(即(Thing, Error) -> Void),它们在完成时调用,因此您无法通过调用此函数知道它何时完成。

您的函数在完成后可能会继续执行其他操作,但没有完成处理程序。

【讨论】:

你会如何实现它 网上有很多从零开始学习 Swift 的好资源! SO 是深入了解很多问题的好地方,但是您要问的内容太广泛了。查看此链接了解更多信息,包括完整的实施细节:grokswift.com/completion-handler-faqs【参考方案2】:

isLoadedCompletionHandler 不是完成处理程序,因为它在分配后立即被调用。

完成处理程序是您传递给函数的闭包,当该函数正在执行的任何异步操作完成时都会调用该闭包。你没有在任何地方传递isLoadedCompletionHandler

你本来可以写的

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

得到了同样的结果。

【讨论】:

以上是关于这是一个适当的完成处理程序吗?的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI - 我可以在按钮操作中使用完成处理程序吗?

我可以在完成处理程序中保存价值吗

查找适当的调试符号

使用 Java 是开发基于 GUI 的会计应用程序的适当语言/平台吗?

我可以下载firebase数据库json吗

我应该在这里使用完成处理程序吗?如果是这样,如何最好地做到这一点?