在Swift中使用C#的async await

7

我目前在使用闭包和链接完成(chained completions)技术玩 Swift。我对 C# 风格的 asyncawait 很熟悉,所以我想知道如何将以下代码片段从 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);
    }
}
< p>Swift是否有类似于 await 的结构,可以等待函数完成,而无需嵌套多个完成块?

谢谢

3个回答

2

目前,Swift 语言中的并发还不存在。它仍然是 Swift 5 的一个提案,在 Swift evolution 上,这是它的链接:并发提案。但是,如果你现在使用 Cocoa/Cocoa Touch 开发应用程序,则可以使用 Dispatch,但我认为它的语法很丑陋。我仍在寻找 Swift 语言中的并发。


2
如果我没记错,你要找的是:
串行调度队列:
串行队列(也称为私有调度队列)按照它们添加到队列中的顺序逐个执行任务。当前正在执行的任务在由调度队列管理的不同线程上运行(可以从任务到任务变化)。串行队列通常用于同步访问特定资源。您可以创建所需数量的串行队列,并且每个队列与所有其他队列并发运行。换句话说,如果您创建了四个串行队列,则每个队列仅执行一个任务,但最多仍然可以同时执行四个任务,即每个队列中的一个。有关如何创建串行队列的信息,请参见创建串行调度队列。
Swift 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")
}

谢谢你的回答 - 在不同的“队列项”中访问参数是否可能? - nor0x

0

你可以使用这个框架来实现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)
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接