From 3aa9419c5d6cec4fcd7d963912eb4a74dc70a38f Mon Sep 17 00:00:00 2001 From: Benoit Martins Date: Fri, 5 Sep 2025 15:19:44 +0200 Subject: [PATCH] Fix awaitDataWrite execution on main queue --- Linphone/Contacts/ContactsManager.swift | 39 ++++++++----------- .../ViewModel/AccountProfileViewModel.swift | 2 +- Linphone/UI/Main/Viewmodel/AccountModel.swift | 2 +- 3 files changed, 19 insertions(+), 24 deletions(-) diff --git a/Linphone/Contacts/ContactsManager.swift b/Linphone/Contacts/ContactsManager.swift index 4c9281ff0..29de8d034 100644 --- a/Linphone/Contacts/ContactsManager.swift +++ b/Linphone/Contacts/ContactsManager.swift @@ -253,7 +253,7 @@ final class ContactsManager: ObservableObject { return } - awaitDataWrite(data: data, name: name, prefix: prefix) { _, result in + awaitDataWrite(data: data, name: name, prefix: prefix) { result in self.saveFriend(result: result, contact: contact, existingFriend: existingFriend) { resultFriend in if resultFriend != nil { if linphoneFriend != self.nativeAddressBookFriendList && existingFriend == nil { @@ -268,7 +268,7 @@ final class ContactsManager: ObservableObject { } } } - completion() + DispatchQueue.main.async { completion() } } } } @@ -352,26 +352,21 @@ final class ContactsManager: ObservableObject { return imagePath } - func awaitDataWrite(data: Data, name: String, prefix: String, completion: @escaping ((), String) -> Void) { - let directory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first + func awaitDataWrite(data: Data, name: String, prefix: String, completion: @escaping (String) -> Void) { + guard let directory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { + completion("") + return + } - if directory != nil { - DispatchQueue.main.async { - do { - if let urlName = URL(string: name + prefix) { - let imagePath = urlName.absoluteString.replacingOccurrences(of: "%", with: "") - - let decodedData: () = try data.write(to: directory!.appendingPathComponent(imagePath + ".png")) - - completion(decodedData, imagePath + ".png") - } else { - completion((), "") - } - } catch { - print("Error: ", error) - completion((), "") - } - } + do { + let fileName = name + prefix + ".png" + let fileURL = directory.appendingPathComponent(fileName) + + try data.write(to: fileURL) + completion(fileName) + } catch { + print("Error writing image: \(error)") + completion("") } } @@ -556,7 +551,7 @@ final class ContactsManager: ObservableObject { for contact in avatarListModel { contact.$starred .sink { [weak self] _ in - self?.starredChangeTrigger = UUID() // 🔁 Déclenche le refresh de la vue + self?.starredChangeTrigger = UUID() } .store(in: &cancellables) } diff --git a/Linphone/UI/Main/Settings/ViewModel/AccountProfileViewModel.swift b/Linphone/UI/Main/Settings/ViewModel/AccountProfileViewModel.swift index 949fa4bce..93fa29cb0 100644 --- a/Linphone/UI/Main/Settings/ViewModel/AccountProfileViewModel.swift +++ b/Linphone/UI/Main/Settings/ViewModel/AccountProfileViewModel.swift @@ -131,7 +131,7 @@ class AccountProfileViewModel: ObservableObject { let photoAvatarModelKey = CoreContext.shared.accounts[self.accountModelIndex!].usernaneAvatar - ContactsManager.shared.awaitDataWrite(data: data, name: name, prefix: prefix) { _, result in + ContactsManager.shared.awaitDataWrite(data: data, name: name, prefix: prefix) { result in UserDefaults.standard.set(result, forKey: photoAvatarModelKey) CoreContext.shared.accounts[self.accountModelIndex ?? 0].photoAvatarModel = "" diff --git a/Linphone/UI/Main/Viewmodel/AccountModel.swift b/Linphone/UI/Main/Viewmodel/AccountModel.swift index e1b48c446..ba4ea5c3f 100644 --- a/Linphone/UI/Main/Viewmodel/AccountModel.swift +++ b/Linphone/UI/Main/Viewmodel/AccountModel.swift @@ -271,7 +271,7 @@ class AccountModel: ObservableObject { let photoAvatarModelKey = name - ContactsManager.shared.awaitDataWrite(data: data, name: name, prefix: prefix) { _, result in + ContactsManager.shared.awaitDataWrite(data: data, name: name, prefix: prefix) { result in UserDefaults.standard.set(result, forKey: photoAvatarModelKey) self.photoAvatarModel = ""