diff options
author | Marc Stibane <marc@taler.net> | 2023-10-13 10:05:29 +0200 |
---|---|---|
committer | Marc Stibane <marc@taler.net> | 2023-10-13 10:05:29 +0200 |
commit | 696dfc84922362363a75859aeb6b3bf3c8366dc3 (patch) | |
tree | 74aa323cbb10da32b159aebd4863aef14d630d5d | |
parent | f7e9c2e0b2775b64daa26b2d6d9693031caf3d0f (diff) | |
download | taler-ios-696dfc84922362363a75859aeb6b3bf3c8366dc3.tar.gz taler-ios-696dfc84922362363a75859aeb6b3bf3c8366dc3.tar.bz2 taler-ios-696dfc84922362363a75859aeb6b3bf3c8366dc3.zip |
AsyncSemaphore to serialize Getbalances
-rw-r--r-- | TalerWallet1/Model/Model+Balances.swift | 21 | ||||
-rw-r--r-- | TalerWallet1/Model/WalletModel.swift | 3 |
2 files changed, 16 insertions, 8 deletions
diff --git a/TalerWallet1/Model/Model+Balances.swift b/TalerWallet1/Model/Model+Balances.swift index 3c5c585..c5fa095 100644 --- a/TalerWallet1/Model/Model+Balances.swift +++ b/TalerWallet1/Model/Model+Balances.swift @@ -45,13 +45,20 @@ extension WalletModel { /// fetch Balances from Wallet-Core. No networking involved @MainActor func balancesM(_ stack: CallStack) async -> [Balance] { // M for MainActor - do { - let request = Balances() - let response = try await sendRequest(request, ASYNCDELAY) - return response.balances // trigger view update in BalancesListView - } catch { - logger.error("balancesM failed: \(error)") - return [] + await semaphore.wait() + defer { semaphore.signal() } + if cachedBalances == nil { + do { + let request = Balances() + let response = try await sendRequest(request, ASYNCDELAY) + cachedBalances = response.balances + } catch { + logger.error("balancesM failed: \(error)") + // TODO: show error + } + } else { + logger.trace("returning cached Balances") } + return cachedBalances ?? [] } } diff --git a/TalerWallet1/Model/WalletModel.swift b/TalerWallet1/Model/WalletModel.swift index 508fbf9..6a24d8e 100644 --- a/TalerWallet1/Model/WalletModel.swift +++ b/TalerWallet1/Model/WalletModel.swift @@ -9,13 +9,14 @@ import os.log fileprivate let DATABASE = "talerwalletdb-v30" fileprivate let ASYNCDELAY: UInt = 0 //set e.g to 6 or 9 seconds for debugging - // MARK: - /// The "virtual" base class for all models class WalletModel: ObservableObject { public static let shared = WalletModel() static func className() -> String {"\(self)"} let logger = Logger (subsystem: "net.taler.gnu", category: "WalletModel") + let semaphore = AsyncSemaphore(value: 1) + var cachedBalances: [Balance]? = nil func sendRequest<T: WalletBackendFormattedRequest> (_ request: T, _ delay: UInt = 0) async throws -> T.Response { // T for any Thread |