Swift 中的 C# 异步等待

Posted

技术标签:

【中文标题】Swift 中的 C# 异步等待【英文标题】:C# async await in Swift 【发布时间】:2017-04-16 00:17:18 【问题描述】:

我目前正在Swift 中使用闭包和链式完成。我对asyncawaitC#风格非常熟悉,所以我想知道如何将下面的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# 异步等待的主要内容,如果未能解决你的问题,请参考以下文章

C# 中的 C++ std::async 与异步/等待

Node.js 与 .net 中的异步/等待

C# 理解阻塞 UI 和异步/等待与 Task.Run 的问题?

如何等待异步函数 Swift

使用异步等待 C# Xamarin

swift 等待异步任务