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 返回时遇到问题

多线程 - Swift 中的 DispatchQueue asyncAfter 延迟