延迟
个人理解类似闭包,会延迟执行,但只要执行了defer定义的代码就一定会执行。
执行顺序
defer的位置越靠前,执行顺序越在后,我们可以在最开始就写上defer保证它最后被执行。
场景
- 网络数据回调
看代码:
func storeList(lon: String, lat: String, storeIds: [Int]?, finishCallBack: @escaping XVDataErrorCallBack) {
XVGoodsRequest.storeList(lon: lon, lat: lat, storeIds: storeIds).send(mapObjectType: XVStoreData.self) { result in
switch result {
case .success(let result):
guard let model = result.model as? XVStoreData else {
HYToast.showText("数据结构不匹配")
finishCallBack(nil, nil)
return
}
self.storeData = model
finishCallBack(model, nil)
case .failure(let error):
finishCallBack(nil, error)
}
}
}
回调一定要有(finishCallback),但因为有错误和成功的情况,且可能有多种错误,所以会写多次回调,我们可以使用defer保证回调一定会有,且只写一次
修改后代码:
func storeList(lon: String, lat: String, storeIds: [Int]?, finishCallBack: @escaping XVDataErrorCallBack) {
XVGoodsRequest.storeList(lon: lon, lat: lat, storeIds: storeIds).send(mapObjectType: XVStoreData.self) { result in
var reError: XVRequestError? = nil
var reModel: Any? = nil
defer {
finishCallBack(reModel, reError)
}
switch result {
case .success(let result):
guard let model = result.model as? XVStoreData else {
HYToast.showText("数据结构不匹配")
reError = XVRequestError.other(1, nil, "数据结构不匹配")
return
}
self.storeData = model
reModel = model
case .failure(let error):
reError = error
}
}
}
网友评论