问题是有时(并非总是)我的完成处理程序变为零。
我已经尝试过[弱自我],但是它不起作用。
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
我想知道如何正确处理它? 谢谢。
答案 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
,请不要这样做。