当我在主线程中执行任何任务(例如 Update my 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()