我正在跟随斯坦福大学的CS193p在线课程学习iOS应用程序开发。
该课程使用Grand Central Dispatch(GCD)API演示多线程。但他们指出:
"自2021年WWDC以来,GCD已被Swift的新内置异步API大部分取代。"
因此,我想了解在使用这个新API后,讲座中的代码会是什么样子。
在观看了苹果的WWDC视频之后,我认为DispatchQueue.global(qos: .userInitiated).async { }
在这个新的异步API中被Task(priority: .userInitiated) {}
或Task { }
所取代,但我不确定DispatchQueue.main.async { }
被替换成了什么?
所以,我的问题如下:
- 我是否正确地假设
DispatchQueue.global(qos: .userInitiated).async { }
已被Task(priority: .userInitiated) {}
所取代? DispatchQueue.main.async { }
被替换成了什么?
请帮忙,我想学习这个新的异步等待API。
以下是使用旧的GCD API的讲座代码:
DispatchQueue.global(qos: .userInitiated).async {
let imageData = try? Data(contentsOf: url)
DispatchQueue.main.async { [weak self] in
if self?.emojiArt.background == EmojiArtModel.Background.url(url) {
self?.backgroundImageFetchStatus = .idle
if imageData != nil {
self?.backgroundImage = UIImage(data: imageData!)
}
// L12 note failure if we couldn't load background image
if self?.backgroundImage == nil {
self?.backgroundImageFetchStatus = .failed(url)
}
}
}
}
整个函数(如果需要查看更多代码):
private func fetchBackgroundImageDataIfNecessary() {
backgroundImage = nil
switch emojiArt.background {
case .url(let url):
// fetch the url
backgroundImageFetchStatus = .fetching
DispatchQueue.global(qos: .userInitiated).async {
let imageData = try? Data(contentsOf: url)
DispatchQueue.main.async { [weak self] in
if self?.emojiArt.background == EmojiArtModel.Background.url(url) {
self?.backgroundImageFetchStatus = .idle
if imageData != nil {
self?.backgroundImage = UIImage(data: imageData!)
}
// L12 note failure if we couldn't load background image
if self?.backgroundImage == nil {
self?.backgroundImageFetchStatus = .failed(url)
}
}
}
}
case .imageData(let data):
backgroundImage = UIImage(data: data)
case .blank:
break
}
}
.userInteractive
来处理Data(contentsOf: url)
。相反,可以考虑使用异步URL方法,例如使用URLSession
。请参考以下链接:https://www.hackingwithswift.com/books/ios-swiftui/sending-and-receiving-codable-data-with-urlsession-and-swiftui - jnpdxURLSession
是更好的方法来实现这个功能,但斯坦福教授暂时使用GCD来解释多线程。几节课后,他改用了URLSession
。 - user14119170DispatchQueue.global(qos:.userInitiated).async {}
已被替换为Task(priority: .userInitiated) {}
?DispatchQueue.main.async {}
已被替换成什么?Task(priority: .userInitiated) {}
替换DispatchQueue.global(qos: .userInitiated).async { }
? - user14119170