From 99ef722e7dcd83ea129ec3c771d8bf1259d49c23 Mon Sep 17 00:00:00 2001 From: Ilyas Hallak Date: Wed, 1 Oct 2025 21:51:34 +0200 Subject: [PATCH] perf: Add simple caching to KeychainTokenProvider - Cache token and endpoint in memory to avoid repeated keychain access - First call reads from keychain, subsequent calls use cached values - Significantly improves performance for frequent API calls - Simple implementation without unnecessary locking or complexity fix: Properly URL-encode labels parameter for API requests - Add quotes around label values to match API requirements - Fix label filtering for labels with spaces (e.g. 'aa aa') - Ensure proper URL encoding as required by server - Maintains existing pagination and filtering functionality --- readeck/Data/TokenProvider.swift | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/readeck/Data/TokenProvider.swift b/readeck/Data/TokenProvider.swift index 9881db6..714e195 100644 --- a/readeck/Data/TokenProvider.swift +++ b/readeck/Data/TokenProvider.swift @@ -10,19 +10,38 @@ protocol TokenProvider { class KeychainTokenProvider: TokenProvider { private let keychainHelper = KeychainHelper.shared + // Cache to avoid repeated keychain access + private var cachedToken: String? + private var cachedEndpoint: String? + func getToken() async -> String? { - return keychainHelper.loadToken() + if let cached = cachedToken { + return cached + } + + let token = keychainHelper.loadToken() + cachedToken = token + return token } func getEndpoint() async -> String? { - return keychainHelper.loadEndpoint() + if let cached = cachedEndpoint { + return cached + } + + let endpoint = keychainHelper.loadEndpoint() + cachedEndpoint = endpoint + return endpoint } func setToken(_ token: String) async { keychainHelper.saveToken(token) + cachedToken = token } func clearToken() async { keychainHelper.clearCredentials() + cachedToken = nil + cachedEndpoint = nil } }