Last active
April 9, 2024 17:40
-
-
Save MaximBazarov/63e6fc68fb448f5dee541c2ea61e7190 to your computer and use it in GitHub Desktop.
Swift Concurrency: Await of one task from multiple tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Foundation | |
actor Auth { | |
private var tokenRefresh: Task<String, Error>? | |
private var _token: String? | |
private var counter: Int = 0 | |
func token() async throws -> String { | |
if var tokenRefresh { | |
try await tokenRefresh.value | |
} | |
let task = Task<String, Error> { | |
let token = try await self.refreshToken() | |
self._token = token | |
return token | |
} | |
self.tokenRefresh = task | |
return try await task.value | |
} | |
func refreshToken() async throws -> String { | |
if let token = _token { return token } | |
let newToken = "token \(counter)" | |
counter += 1 | |
_token = newToken | |
return newToken | |
} | |
} | |
actor Networking { | |
var auth = Auth() | |
func perform(request: (String) -> Void) async throws { | |
let token = try await auth.token() | |
request(token) | |
} | |
} | |
let x = Networking() | |
for _ in 0...10 { | |
Task.detached { | |
try await x.perform { | |
print($0) | |
} | |
} | |
} | |
/** | |
token 0 | |
token 0 | |
token 0 | |
token 0 | |
token 0 | |
token 0 | |
token 0 | |
token 0 | |
token 0 | |
token 0 | |
token 0 | |
*/ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment