为什么有时不调用完成处理程序?

时间:2019-06-18 11:43:41

标签: ios swift

问题是有时(并非总是)我的完成处理程序变为零。

我已经尝试过[弱自我],但是它不起作用。

func setup() {
 _collectionView.refreshControl?.addTarget(self, action: #selector(refresh(sender:)), for: .valueChanged)
}
 @objc private func refresh(sender: UIRefreshControl) {
       print("request1")
       request(refresh: true, completion: { () -> Void in
           // When completion become nil, this is not called.
           (sender as UIRefreshControl).endRefreshing()
           print("completion1")
       })
   }


   fileprivate func request(refresh: Bool, completion: (() -> Void)? = nil) {

       guard !isFetchInProgress else {
           return
       }
       isFetchInProgress = true

       APIRequest.request(request: request).success { [weak self] result in
           Log.debugLog(“success!:%@“, result)
               if let _self = self {
                   if RequestResponseManager.sharedInstance.handleResponse(response: result) {
                        if let _data = result.data {
                         print(_data)
                   }
               }
           }.failure { error, _ in
               Log.debugLog(“%@“, error.debugDescription)
               completion?()
               isFetchInProgress = false
           }.then { _,_  in
               Log.debugLog(“then!“)    

               // SOMETIMES (not always) completion?() become nil
               completion?()
               isFetchInProgress =false
           }
   }
    public func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {

        var target: UICollectionReusableView? = nil
  if kind == UICollectionView.elementKindSectionFooter {
            target = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: footerId, for: indexPath)

            if isNeedRequest {
                print("request2")
                self.request(refresh: false)
            }
        }

        return target!
    }

1,正常上下滚动时,日志显示如下,就可以了。

request1
completion1
request2

2,但是,当上下滚动速度更快时,日志显示如下,并且从未调用完成1和停止refreshControl。

request1
request2

我想知道如何正确处理它? 谢谢。

1 个答案:

答案 0 :(得分:2)

完成处理程序不会“变为” nil。如果在调用该方法时未提供完成处理程序,则默认为nil

您的方法已声明

fileprivate func request(refresh: Bool, completion: (() -> Void)? = nil)

这意味着实际上有两种方法可以调用此方法。您可以使用完成处理程序来调用它:

request(refresh: true) {
    // this is the completion handler
}

request(refresh: false) {
    // this is the completion handler
}

但是您也可以在没有完成处理程序的情况下将其称为

request(refresh: true)

request(refresh: false)

在这种情况下,在您的request方法中,completion将是nil。因此,如果您不希望completion成为nil,请不要这样做。