我正在嘗試通過多步異步呼叫獲取詳細的專案串列。首先我獲取一個識別符號串列,然后我獲取每個識別符號的詳細資訊。
func fetchList() async -> [UUID] {
// some async network call here
await Task.sleep(2)
return [UUID(), UUID(), UUID()]
}
func fetchDetail(forUUID uuid: UUID) async -> String {
// some async network call here
await Task.sleep(1)
return "\(uuid.uuidString.reversed())"
}
這些功能單獨作業正常,但是當我想嘗試使用.map串列中的a 時,我被卡住了。
Task {
let list = await fetchList()
let details = await list.map { fetchDetail(forUUID: $0) } // Does not work
}
我確實發現了這個withTaskGroup函式,我當然可以異步附加到一組專案,但我想知道是否有更好的方法來實作這個功能。
uj5u.com熱心網友回復:
我相信您不需要在 list.map 前面使用“await”,因為您正在呼叫的函式中已經包含“await”。另外,“.map”是同步的。
uj5u.com熱心網友回復:
需要處理異步代碼的映射AsyncSequence。
struct DelayedUUIDs: AsyncSequence {
typealias Element = UUID
struct DelayedIterator: AsyncIteratorProtocol {
private var internalIterator = [UUID(), UUID(), UUID()].makeIterator()
mutating func next() async -> UUID? {
await Task.sleep(1_000_000_000)
return internalIterator.next()
}
}
func makeAsyncIterator() -> DelayedIterator {
DelayedIterator()
}
}
func fetchList() async -> DelayedUUIDs {
// some async network call here
await Task.sleep(1)
return DelayedUUIDs()
}
func fetchDetail(forUUID uuid: UUID) async -> String {
// some async network call here
await Task.sleep(1)
return "ID: \(uuid.uuidString)"
}
Task {
let list = await fetchList()
let details = list.map({ id in await fetchDetail(forUUID: id) })
for await value in list {
print(Date())
print(value)
}
for await value in details {
print(Date())
print(value as String)
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/345147.html
