From ae1aa39c5d4c0555f18dbc7c4b038520d5cea20c Mon Sep 17 00:00:00 2001 From: Laurent Date: Fri, 24 Jan 2025 10:14:05 +0100 Subject: [PATCH] Fix sync crash --- LeStorage/Services.swift | 16 +++++++++------- LeStorage/StoreCenter.swift | 13 +++++-------- LeStorage/StoredCollection+Sync.swift | 2 ++ 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/LeStorage/Services.swift b/LeStorage/Services.swift index b4f6f56..0ff3183 100644 --- a/LeStorage/Services.swift +++ b/LeStorage/Services.swift @@ -96,7 +96,7 @@ public class Services { try await StoreCenter.main.deleteApiCallById(type: T.self, id: apiCall.id) if T.self == GetSyncData.self { - StoreCenter.main.synchronizeContent(task.0) + await StoreCenter.main.synchronizeContent(task.0) } default: // error @@ -395,8 +395,8 @@ public class Services { /// - since: The date from which updates are retrieved func synchronizeLastUpdates(since: Date?) async throws { let request = try self._getSyncLogRequest(since: since) - try await self._runRequest(request) { data in - StoreCenter.main.synchronizeContent(data) + if let data = try await self._runRequest(request) { + await StoreCenter.main.synchronizeContent(data) } } @@ -429,7 +429,7 @@ public class Services { /// Runs the a sync request and forwards the response to the StoreCenter for processing /// - Parameters: /// - request: The synchronization request - fileprivate func _runRequest(_ request: URLRequest, _ success: (Data) -> ()) async throws { + fileprivate func _runRequest(_ request: URLRequest) async throws -> Data? { let debugURL = request.url?.absoluteString ?? "" // print("Run \(request.httpMethod ?? "") \(debugURL)") @@ -441,7 +441,8 @@ public class Services { print("\(debugURL) ended, status code = \(statusCode)") switch statusCode { case 200..<300: // success - success(task.0) + return task.0 +// success(task.0) default: // error Logger.log( "Failed Run \(request.httpMethod ?? "") \(request.url?.absoluteString ?? "")") @@ -457,6 +458,7 @@ public class Services { StoreCenter.main.log(message: message) Logger.w(message) } + return nil } // MARK: - Services @@ -622,8 +624,8 @@ public class Services { /// Returns the list of DataAccess public func getUserDataAccess() async throws { let request = try self._baseRequest(call: getUserDataAccessCall) - try await self._runRequest(request) { data in - StoreCenter.main.userDataAccessRetrieved(data) + if let data = try await self._runRequest(request) { + await StoreCenter.main.userDataAccessRetrieved(data) } } diff --git a/LeStorage/StoreCenter.swift b/LeStorage/StoreCenter.swift index 0f2fe18..b9ecd87 100644 --- a/LeStorage/StoreCenter.swift +++ b/LeStorage/StoreCenter.swift @@ -472,7 +472,7 @@ public class StoreCenter { } /// Processes Data Access data - func userDataAccessRetrieved(_ data: Data) { + func userDataAccessRetrieved(_ data: Data) async { do { guard let json = try JSONSerialization.jsonObject(with: data, options: []) @@ -481,17 +481,14 @@ public class StoreCenter { Logger.w("data unrecognized") return } - - try self._parseSyncUpdates(json, shared: true) - - } - catch { + try await self._parseSyncUpdates(json, shared: true) + } catch { Logger.error(error) } } /// Processes the data coming from a sync request - func synchronizeContent(_ data: Data) { + @MainActor func synchronizeContent(_ data: Data) { do { guard @@ -540,7 +537,7 @@ public class StoreCenter { /// - Parameters: /// - updates: the server updates /// - shared: indicates if the content should be flagged as shared - fileprivate func _parseSyncUpdates(_ updates: [String: Any], shared: Bool = false) throws { + @MainActor func _parseSyncUpdates(_ updates: [String: Any], shared: Bool = false) throws { for (className, updateData) in updates { guard let updateArray = updateData as? [[String: Any]] else { Logger.w("Invalid update data for \(className)") diff --git a/LeStorage/StoredCollection+Sync.swift b/LeStorage/StoredCollection+Sync.swift index 18a3b77..eee6d7f 100644 --- a/LeStorage/StoredCollection+Sync.swift +++ b/LeStorage/StoredCollection+Sync.swift @@ -104,6 +104,7 @@ extension StoredCollection: SomeSyncedCollection where T : SyncedStorable { /// Adds or update an instance and writes public func addOrUpdate(instance: T) { + Logger.log("\(T.resourceName()) : one item") defer { self.setChanged() } @@ -120,6 +121,7 @@ extension StoredCollection: SomeSyncedCollection where T : SyncedStorable { /// Adds or update a sequence and writes public func addOrUpdate(contentOfs sequence: any Sequence) { + Logger.log("\(T.resourceName()) : \(sequence.underestimatedCount) items") defer { self.setChanged() }