Swift 中的 C# 异步等待
Posted
技术标签:
【中文标题】Swift 中的 C# 异步等待【英文标题】:C# async await in Swift 【发布时间】:2017-04-16 00:17:18 【问题描述】:我目前正在Swift
中使用闭包和链式完成。我对async
和await
的C#
风格非常熟悉,所以我想知道如何将下面的sn-p从C#
“翻译”成Swift
。
public async Task SomeFunction(string inputString)
var first = await GetFirstVariableAsync(inputString);
var second = await GetSecondVariableAsync(first);
if (second == "some condition")
first = await GetFirstVariableAsync(inputString);
var second = await GetSecondVariableAsync(first);
Swift
是否有类似await
的构造,可以等待函数完成,而不必嵌套多个完成块?
谢谢
【问题讨论】:
【参考方案1】:如果我没记错的话,你要找的是:
串行调度队列:
串行队列(也称为私有调度队列)执行一项任务 一次按它们添加到队列中的顺序。这 当前正在执行的任务在不同的线程上运行(可能会有所不同 从任务到任务)由调度队列管理。串行 队列通常用于同步对特定资源的访问。 您可以根据需要创建任意数量的串行队列,并且每个队列 相对于所有其他队列同时运行。其他 换句话说,如果你创建四个串行队列,每个队列只执行一个 一次任务,但最多四个任务仍可以同时执行, 每个队列中的一个。有关如何创建串行队列的信息, 请参阅创建串行调度队列。
斯威夫特 3:
let serialQueue = DispatchQueue(label: "serialQueue")
serialQueue.sync
print("running first task")
serialQueue.sync
print("I will wait the first task and then I'll do my own task")
【讨论】:
感谢您的回答 - 是否可以访问不同“队列项”中的参数?【参考方案2】:目前concurrency in Swift language
还没有。它仍然是Swift evolution 上的Swift 5
的提案,这里是它的链接:concurrency proposal。但是如果这次你使用Cocoa
/Cocoa touch
开发应用程序,那么你可以使用Dispatch,但我认为它的语法很丑陋。我仍在寻找Swift
语言的并发性
【讨论】:
【参考方案3】:您可以将此框架用于 Swift 协程 - https://github.com/belozierov/SwiftCoroutine
func awaitAPICall(_ url: URL) throws -> String?
let future = URLSession.shared.dataTaskFuture(for: url)
let data = try future.await().data
return String(data: data, encoding: .utf8)
func load(url: URL)
DispatchQueue.main.startCoroutine
let result1 = try self.awaitAPICall(url)
let result2 = try self.awaitAPICall2(result1)
let result3 = try self.awaitAPICall3(result2)
print(result3)
【讨论】:
以上是关于Swift 中的 C# 异步等待的主要内容,如果未能解决你的问题,请参考以下文章