0

我有一个使用 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!)")
                    }
                })
            }
        }

我做对了还是需要修改?

4

2 回答 2

1

您不需要只调度到后台队列吗?还是需要在主线程上运行?

    DispatchQueue.global().async {…}
于 2018-01-31T13:33:13.433 回答
0

如果您已经在主线程上,我看不出异步调度它的原因,我相信在您的情况下这样做会更好:

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!)")
    }
})

说明:您已经在主线程上,在主线程上异步调度任务只会将该任务排入主线程,因此它不会立即执行,而是在当前任务结束时执行(例如,绘图, ETC。)。我假设这imapFetchFoldersOp是一项从邮件服务器下载一些数据的任务 - 在这种情况下,如果您正在使用URLSession或某个库,很可能它将在某个后台线程上执行,因此这不应意味着任何开销。

于 2018-01-31T13:13:14.027 回答