Fix sync crash

sync2
Laurent 10 months ago
parent d41bb138dd
commit ae1aa39c5d
  1. 16
      LeStorage/Services.swift
  2. 13
      LeStorage/StoreCenter.swift
  3. 2
      LeStorage/StoredCollection+Sync.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)
}
}

@ -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)")

@ -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<T>) {
Logger.log("\(T.resourceName()) : \(sequence.underestimatedCount) items")
defer {
self.setChanged()
}

Loading…
Cancel
Save