Swift 1.2迁移至Swift 4:DispatchQueue异步实现是否正确?
你的改写分析与优化建议
你的改写整体方向是完全正确的,已经完成了从Swift 1.2旧GCD语法到Swift 4+现代语法的核心转换,而且还加入了循环引用防护的最佳实践,值得肯定!不过还有几个细节可以进一步优化,让代码更安全、更符合Swift的现代风格:
已做的正确改动
- 成功将旧的Objective-C风格GCD调用
dispatch_async(dispatch_get_main_queue())替换为Swift 4+的DispatchQueue.main.async,这是符合苹果官方推荐的现代GCD用法的。 - 添加了
[weak self]捕获列表和strongSelf可选绑定,有效避免了闭包持有self导致的循环引用风险,这是处理闭包中self引用的标准最佳实践。 - 完整保留了原业务逻辑,包括错误处理、调试打印、文件夹数据更新和后续方法调用,逻辑上完全对齐原代码。
可以优化的细节
简化嵌套层级,用
guard let替代if let
原代码中用if let strongSelf = self把后续逻辑嵌套在大括号里,Swift中更推荐用guard let提前退出,让主逻辑保持平铺,可读性更好:DispatchQueue.main.async { [weak self] in guard let strongSelf = self else { return } // 后续逻辑直接写在这里,不用嵌套 strongSelf.imapFetchFoldersOp?.start({ (error, folders) -> Void in // ... 内部逻辑 }) }消除强制解包,避免崩溃风险
代码中的folders!是强制解包操作,如果folders在error为nil的情况下依然是nil(虽然业务逻辑上可能不会,但代码层面存在风险),会直接导致崩溃。建议用可选绑定处理:else { guard let safeFolders = folders else { #if DEBUG print("Folders is unexpectedly nil when no error occurred") #endif return } strongSelf.folders = safeFolders as NSArray strongSelf.fetchInfoForBoxes() print("Folders :\(safeFolders)") }优先使用Swift原生数组类型
尽量避免使用NSArray这种Objective-C兼容类型,建议把folders的类型转换为Swift原生数组(比如假设你的文件夹模型是Folder,就转成[Folder]),这样能利用Swift的类型安全特性:strongSelf.folders = safeFolders as? [Folder] ?? []这里用
as?加默认空数组,比强制转换更安全。调试打印的优化
String(describing: error._userInfo)可以换成更适合调试的debugPrint(error.userInfo),它会输出更清晰的字典结构,而且不需要访问私有属性_userInfo(直接用userInfo即可):#if DEBUG debugPrint("Fetch folders error info: \(error.userInfo)") #endif
优化后的完整代码示例
DispatchQueue.main.async { [weak self] in guard let strongSelf = self else { return } strongSelf.imapFetchFoldersOp?.start({ (error, folders) -> Void in if let error = error { #if DEBUG debugPrint("Fetch folders error info: \(error.userInfo)") #endif } else { guard let safeFolders = folders else { #if DEBUG print("Unexpected nil folders with no error") #endif return } // 假设Folder是你的模型类型,替换成实际类型 strongSelf.folders = safeFolders as? [Folder] ?? [] strongSelf.fetchInfoForBoxes() print("Folders :\(safeFolders)") } }) }
内容的提问来源于stack exchange,提问作者user8769899
相关产品推荐
相关产品推荐

