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

Yum*_*nc. 5 queue asynchronous operation swift dispatch-queue

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

其他时候,建议在其中编写代码DispatchQueue.main.async

两者之间有什么区别?

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

Nah*_*han 5

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

来自 Apple Doc 的OperationQueue

NSOperationQueue 类管理一组 Operation 对象的执行。添加到队列后,操作将保留在该队列中,直到它被明确取消或完成其任务的执行。队列中的操作(但尚未执行)本身根据优先级和操作间对象依赖性进行组织,并相应地执行。一个应用程序可以创建多个操作队列并向其中任何一个提交操作。

例子 :

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

}
Run Code Online (Sandbox Code Playgroud)

Apple Doc 中的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()
Run Code Online (Sandbox Code Playgroud)