dispatchqueue 在 Swift 4 中异步使用以加速
Posted
技术标签:
【中文标题】dispatchqueue 在 Swift 4 中异步使用以加速【英文标题】:dispatchqueue using in asynchronously to speedup in Swift 4 【发布时间】:2018-01-31 13:09:44 【问题描述】:我有一个使用 Swift 1.2 开发的旧 ios 应用程序。在那个使用调度队列来加速运行时。
dispatch_async(dispatch_get_main_queue())
在 Swift 4 中,我尝试过如下更改
DispatchQueue.main.async [weak self] in
if let strongSelf = self
strongSelf.imapFetchFoldersOp?.start( (error, folders) -> Void in
if let error = error
#if DEBUG
print("\(String(describing: error._userInfo))")
#endif
else
strongSelf.folders = folders! as NSArray
strongSelf.fetchInfoForBoxes()
print("Floders :\(folders!)")
)
我做对了吗,还是需要修改?
【问题讨论】:
【参考方案1】:您不需要只调度到后台队列吗?还是需要在主线程上运行?
DispatchQueue.global().async …
【讨论】:
【参考方案2】:如果您已经在主线程上,我看不出异步调度它的原因,我相信在您的情况下这样做会更好:
self.imapFetchFoldersOp?.start( (error, folders) -> Void in
if let error = error
#if DEBUG
print("\(String(describing: error._userInfo))")
#endif
else
self.folders = folders! as NSArray
self.fetchInfoForBoxes()
print("Folders :\(folders!)")
)
说明:您已经在主线程上,在主线程上异步调度任务只会将该任务排入主线程,因此它不会立即执行,而是在当前任务结束时执行(例如、绘图等)。我假设imapFetchFoldersOp
是一个从邮件服务器下载一些数据的任务 - 在这种情况下,如果您使用URLSession
或某个库,很可能它将在某个后台线程上执行,因此不应该暗示任何开销。
【讨论】:
以上是关于dispatchqueue 在 Swift 4 中异步使用以加速的主要内容,如果未能解决你的问题,请参考以下文章
使用 DispatchGroup、DispatchQueue 和 DispatchSemaphore 按顺序执行带有 for 循环的 Swift 4 异步调用
在 Swift 中使用 DispatchQueue 进行同步处理
如何在 Swift 中测量 DispatchQueue 并发异步中的代码块执行时间?
为啥在 swift 的 mac 命令行工具中使用 DispatchQueue.main.async 时需要运行循环?
在使用 Swift 的 iOS 应用程序中使用 DispatchQueue 等待数据从 Cloud Firestore 返回时遇到问题