From 44bea185699711ca01713e860df9eeea1f8c1d23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrien=20Coye=20de=20Brune=CC=81lis?= Date: Wed, 30 Aug 2023 18:01:07 +0200 Subject: [PATCH 1/3] feat(ContactManager): reduce getRealm call count. feat(ContactManager): refresh realm on getRealm() to match the app. --- MailCore/Cache/ContactManager/ContactManager+DB.swift | 4 +++- MailCore/Cache/ContactManager/ContactManager+Merge.swift | 8 +++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/MailCore/Cache/ContactManager/ContactManager+DB.swift b/MailCore/Cache/ContactManager/ContactManager+DB.swift index 7ac9e453a..b55ab6225 100644 --- a/MailCore/Cache/ContactManager/ContactManager+DB.swift +++ b/MailCore/Cache/ContactManager/ContactManager+DB.swift @@ -22,7 +22,9 @@ import RealmSwift public extension ContactManager { func getRealm() -> Realm { do { - return try Realm(configuration: realmConfiguration) + let realm = Realm(configuration: realmConfiguration) + realm.refresh() + return try } catch { // We can't recover from this error but at least we report it correctly on Sentry Logging.reportRealmOpeningError(error, realmConfiguration: realmConfiguration) diff --git a/MailCore/Cache/ContactManager/ContactManager+Merge.swift b/MailCore/Cache/ContactManager/ContactManager+Merge.swift index 23c7a51a3..30bdb56f5 100644 --- a/MailCore/Cache/ContactManager/ContactManager+Merge.swift +++ b/MailCore/Cache/ContactManager/ContactManager+Merge.swift @@ -62,6 +62,7 @@ extension ContactManager { // Insert Contacts indexed by email in base without check private func insertContactsInDB(_ input: [String: InfomaniakContact]) { + let realm = getRealm() for (email, contact) in input { guard !Task.isCancelled else { break @@ -72,7 +73,6 @@ extension ContactManager { return } - let realm = getRealm() try? realm.safeWrite { realm.add(mergedContact, update: .modified) } @@ -90,7 +90,10 @@ extension ContactManager { stop.pointee = true return } - + + // Realm to use for this contact + let realm = self.getRealm() + // For each email of a specific contact for cnEmail in localContact.emailAddresses { let email = String(cnEmail.value) @@ -107,7 +110,6 @@ extension ContactManager { output.removeValue(forKey: email) // Store result - let realm = self.getRealm() try? realm.safeWrite { realm.add(mergedContact, update: .modified) } From 0709e7171c968c7de934c1cb6efe490b6f5fc42c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrien=20Coye=20de=20Brune=CC=81lis?= Date: Wed, 30 Aug 2023 18:05:15 +0200 Subject: [PATCH 2/3] chore: cleanup useless code --- .../Cache/ContactManager/ContactManager+Merge.swift | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/MailCore/Cache/ContactManager/ContactManager+Merge.swift b/MailCore/Cache/ContactManager/ContactManager+Merge.swift index 30bdb56f5..885e796f2 100644 --- a/MailCore/Cache/ContactManager/ContactManager+Merge.swift +++ b/MailCore/Cache/ContactManager/ContactManager+Merge.swift @@ -33,17 +33,6 @@ extension CNContact { extension ContactManager { func merge(localInto remote: [InfomaniakContact]) async { - // Refresh Realm, and trigger redraws, only if app is in foreground. - defer { - Task { @MainActor in - let state = UIApplication.shared.applicationState - if state == .active { - DDLogInfo("Done merging remote and local contacts, refreshing DB…") - getRealm().refresh() - } - } - } - // index remote account per email var remoteContactsByEmail = [String: InfomaniakContact]() for contact in remote { From cc148206bc01782ffcdb36ff4658990a4a8c3961 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrien=20Coye=20de=20Brune=CC=81lis?= Date: Thu, 31 Aug 2023 10:43:15 +0200 Subject: [PATCH 3/3] fix(ContactManager): Remove contacts from DB when does not exist in iphone or infomaniak --- .../ContactManager/ContactManager+DB.swift | 9 +- .../ContactManager/ContactManager+Merge.swift | 192 ++++++++++++------ .../Cache/ContactManager/ContactManager.swift | 4 +- MailCore/Models/MergedContact.swift | 2 +- 4 files changed, 135 insertions(+), 72 deletions(-) diff --git a/MailCore/Cache/ContactManager/ContactManager+DB.swift b/MailCore/Cache/ContactManager/ContactManager+DB.swift index b55ab6225..2d6744dcf 100644 --- a/MailCore/Cache/ContactManager/ContactManager+DB.swift +++ b/MailCore/Cache/ContactManager/ContactManager+DB.swift @@ -22,9 +22,9 @@ import RealmSwift public extension ContactManager { func getRealm() -> Realm { do { - let realm = Realm(configuration: realmConfiguration) + let realm = try Realm(configuration: realmConfiguration) realm.refresh() - return try + return realm } catch { // We can't recover from this error but at least we report it correctly on Sentry Logging.reportRealmOpeningError(error, realmConfiguration: realmConfiguration) @@ -54,7 +54,7 @@ public extension ContactManager { // Iterate a given number of times to emulate a `LIMIT` statement. var iterator = lazyResults.makeIterator() var results = [MergedContact]() - for _ in 0..