Skip to content

Instantly share code, notes, and snippets.

@MaximBazarov
Last active April 9, 2024 17:40
Show Gist options
  • Save MaximBazarov/63e6fc68fb448f5dee541c2ea61e7190 to your computer and use it in GitHub Desktop.
Save MaximBazarov/63e6fc68fb448f5dee541c2ea61e7190 to your computer and use it in GitHub Desktop.
Swift Concurrency: Await of one task from multiple tasks
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