SWIFT-OperationQueue.main.addOperation和DispatchQueue.main.async有什么区别?

时间:2018-06-21 15:31:46

标签: swift asynchronous queue operation dispatch-queue

有时我必须在主线程上做一些事情,并建议将代码放在OperationQueue.main.addOperation内。

有时,建议将代码写在DispatchQueue.main.async内。

这两者之间有什么区别?

(有一个类似的问题标题,但是内容不匹配。)

2 个答案:

答案 0 :(得分:4)

当我在主线程中执行任何任务(例如更新我的APP UI)时,我使用了'DispatchQueue.main.async'。当您需要在主线程中运行其他操作或阻塞时,可以使用“ OperationQueue”。查看本文以了解有关OperationQueue

的更多信息

OperationQueue 来自Apple Doc

  

NSOperationQueue类可调节一组   操作对象。添加到队列后,仍保留操作   在该队列中直到它被明确取消或完成执行   它的任务。队列中的操作(但尚未执行)是   自己根据优先级和互操作性进行组织   对象依赖关系并相应执行。申请可能   创建多个操作队列并向其中任何一个提交操作。

示例:

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var label: UILabel!
    @IBOutlet weak var activityIndicator: UIActivityIndicatorView!

    override func viewDidLoad() {
        super.viewDidLoad()
        activityIndicator.startAnimating()
        calculate()
    }

    private func calculate() {
        let queue = OperationQueue()
        let blockOperation = BlockOperation {

            var result = 0

            for i in 1...1000000000 {
                result += i
            }

            OperationQueue.main.addOperation {
                self.activityIndicator.stopAnimating()
                self.label.text = "\(result)"
                self.label.isHidden = false
            }
        }

        queue.addOperation(blockOperation)
    }

}

DispatchQueue 从Apple Doc

  

DispatchQueue管理工作项的执行。每个工作项   提交到队列的内容是在由   系统。

示例:

URLSession.shared.dataTask(with: url) { data, response, error in
    guard let data = data, error == nil else { 
        print(error ?? "Unknown error")
        return 
    }

    do {
        let heroes = try JSONDecoder().decode([HeroStats].self, from: data)
        DispatchQueue.main.async {
            self.heroes = heroes
            completed()
        }
    } catch let error {
        print(error)
    }
}.resume()

答案 1 :(得分:0)

OperationQueue只是Grand Central Dispatch(GCD / libdispatch)上的目标C包装器。

如果使用的是OperationQueue,则暗中使用的是Grand Central Dispatch。

OperationQueue.main.addOperation因此在后台使用DispatchQueue.main.async。在C API(GCD)上使用Objective C(OperationQueue)会产生一些开销,因此使用GCD会有一点性能提升。

我建议阅读布拉德·拉尔森(Brad Larson)关于他为什么更喜欢GCD而不是OperationQueue的答案,但这是值得商subject的话题。

NSOperation vs Grand Central Dispatch

相关问题