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

13
有时候,我必须在主线程上执行一些操作,建议将代码放在 OperationQueue.main.addOperation 中。
其他时候,建议将代码写在 DispatchQueue.main.async 中。
这两者之间的区别是什么?
(有一个类似的问题标题,但内容不匹配。)

你可能想阅读这篇文章 https://dev59.com/K1kR5IYBdhLWcg3w1wgh#40764240 - Sahil Manchanda
我觉得这个解释非常有帮助。 - Reinhard Männer
2个回答

5
当我在主线程中执行任何任务时,我使用“DispatchQueue.main.async”来更新我的应用程序界面。当您需要在主线程中运行进一步的操作或阻塞时,可以使用“OperationQueue”。查看此文章了解更多信息。
根据苹果文档,OperationQueue类调节执行一组操作对象。将操作添加到队列后,操作将一直保留在该队列中,直到明确取消或完成执行其任务。队列内(但尚未执行)的操作本身根据优先级级别和操作间对象依赖关系进行组织,并相应地执行。应用程序可以创建多个操作队列并将操作提交到其中。
例如:
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 来自苹果文档

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

OperationQueue是Grand Central Dispatch(GCD / libdispatch)的一个Objective C封装。

如果您正在使用OperationQueue,则隐式地使用Grand Central Dispatch。

因此,OperationQueue.main.addOperation在幕后使用DispatchQueue.main.async。使用Objective C(OperationQueue)会产生一些开销,相对于使用C API(GCD),使用GCD会略微提高性能。

我建议阅读Brad Larson的答案,了解他为什么更喜欢GCD而不是OperationQueue,但这是一个有争议的话题。

NSOperation vs Grand Central Dispatch


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接