有时我必须在主线程上做一些事情,并建议将代码放在OperationQueue.main.addOperation
内。
有时,建议将代码写在DispatchQueue.main.async
内。
这两者之间有什么区别?
(有一个类似的问题标题,但是内容不匹配。)
答案 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的话题。