我有一个用 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!)")
}
})
}
}
我是否正确操作或需要修改?
您不需要调度到后台队列吗? 还是需要在主线程上运行?
DispatchQueue.global().async {…}
如果您已经在主线程上,我看不出将其异步调度到它的原因,我相信在您的情况下,最好这样做:
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
或某些库,它很可能会在某个后台线程上执行,因此这不应该意味着任何开销。