如何在异步代码中逐行显示?
How to showing line one by one in async code?
我想用异步做for循环代码。为了模拟异步,我添加了一些延迟。
import Cocoa
class ViewController: NSViewController {
private let semaphore = DispatchSemaphore(value: 0)
private let concurrentQueue = DispatchQueue.global()
override func viewDidLoad() {
super.viewDidLoad()
for i in 1...10 {
if run(i) {
break
}
}
}
func run(_ i:Int) -> Bool{
let seed = arc4random()
let isSuccess = seed % 5 == 1
let delayInSeconds = Int(seed % 3)
concurrentQueue.asyncAfter(wallDeadline: .now() + .seconds(delayInSeconds)) {
DispatchQueue.main.async {
self.textView.string += "\(i)\t\(seed)\n"
}
self.semaphore.signal()
}
semaphore.wait()
return isSuccess
}
override var representedObject: Any? {
didSet {
// Update the view, if already loaded.
}
}
@IBOutlet var textView: NSTextView!
}
问题是,当代码运行时,所有行都是一次性添加的。我要一一添加。有什么想法吗?
问题已解决。更新 UI 部分不起作用的原因是因为 func run()
在主线程上是 运行,它总是被 semaphore.wait()
阻塞。所以为了解决这个问题,只是把它添加到另一个线程。
override func viewDidLoad() {
super.viewDidLoad()
concurrentQueue.async {
for i in 1...10 {
if self.run(i) {
break
}
}
}
}
我想用异步做for循环代码。为了模拟异步,我添加了一些延迟。
import Cocoa
class ViewController: NSViewController {
private let semaphore = DispatchSemaphore(value: 0)
private let concurrentQueue = DispatchQueue.global()
override func viewDidLoad() {
super.viewDidLoad()
for i in 1...10 {
if run(i) {
break
}
}
}
func run(_ i:Int) -> Bool{
let seed = arc4random()
let isSuccess = seed % 5 == 1
let delayInSeconds = Int(seed % 3)
concurrentQueue.asyncAfter(wallDeadline: .now() + .seconds(delayInSeconds)) {
DispatchQueue.main.async {
self.textView.string += "\(i)\t\(seed)\n"
}
self.semaphore.signal()
}
semaphore.wait()
return isSuccess
}
override var representedObject: Any? {
didSet {
// Update the view, if already loaded.
}
}
@IBOutlet var textView: NSTextView!
}
问题是,当代码运行时,所有行都是一次性添加的。我要一一添加。有什么想法吗?
问题已解决。更新 UI 部分不起作用的原因是因为 func run()
在主线程上是 运行,它总是被 semaphore.wait()
阻塞。所以为了解决这个问题,只是把它添加到另一个线程。
override func viewDidLoad() {
super.viewDidLoad()
concurrentQueue.async {
for i in 1...10 {
if self.run(i) {
break
}
}
}
}