swift中的defer使用场景

2021-09-15  本文已影响0人  梁森的简书

延迟

个人理解类似闭包,会延迟执行,但只要执行了defer定义的代码就一定会执行。

执行顺序

defer的位置越靠前,执行顺序越在后,我们可以在最开始就写上defer保证它最后被执行。

场景

  1. 网络数据回调
    看代码:
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
            }
        }
    }
上一篇 下一篇

猜你喜欢

热点阅读