Quellcode durchsuchen

deviceContactFetching now on background thread as recommended

nayooti vor 5 Jahren
Ursprung
Commit
247df6d9e7
1 geänderte Dateien mit 35 neuen und 31 gelöschten Zeilen
  1. 35 31
      deltachat-ios/Handler/DeviceContactsHandler.swift

+ 35 - 31
deltachat-ios/Handler/DeviceContactsHandler.swift

@@ -18,47 +18,51 @@ class DeviceContactsHandler {
     }
 
     private func addContactsToCore() {
-        let storedContacts = fetchContactsWithEmailFromDevice()
-        assert(Thread.isMainThread)
-        let contactString = makeContactString(contacts: storedContacts)
-        dc_add_address_book(mailboxPointer, contactString)
-        contactListDelegate?.deviceContactsImported()
+        fetchContactsWithEmailFromDevice() { contacts in
+            DispatchQueue.main.async {
+                let contactString = self.makeContactString(contacts: contacts)
+                dc_add_address_book(mailboxPointer, contactString)
+                self.contactListDelegate?.deviceContactsImported()
+            }
+        }
     }
 
-    private func fetchContactsWithEmailFromDevice() -> [CNContact] {
-        let keys = [CNContactFamilyNameKey, CNContactGivenNameKey, CNContactEmailAddressesKey]
 
-        var fetchedContacts: [CNContact] = []
+    private func fetchContactsWithEmailFromDevice(completionHandler: @escaping ([CNContact])->Void) {
 
-        var allContainers: [CNContainer] = []
-        do {
-            allContainers = try store.containers(matching: nil)
-        } catch {
-            return []
-        }
+        DispatchQueue.global(qos: .background).async {
+            let keys = [CNContactFamilyNameKey, CNContactGivenNameKey, CNContactEmailAddressesKey]
 
-        for container in allContainers {
-            let predicates = CNContact.predicateForContactsInContainer(withIdentifier: container.identifier)
-            let request = CNContactFetchRequest(keysToFetch: keys as [CNKeyDescriptor])
-            request.mutableObjects = true
-            request.unifyResults = true
-            request.sortOrder = .userDefault
-            request.predicate = predicates
+            var fetchedContacts: [CNContact] = []
+
+            var allContainers: [CNContainer] = []
             do {
-                try store.enumerateContacts(with: request) { contact, _ in
-                    if !contact.emailAddresses.isEmpty {
-                        fetchedContacts.append(contact)
-                    } else {
-                        print(contact)
+                allContainers = try self.store.containers(matching: nil)
+            } catch {
+                return
+            }
+
+            for container in allContainers {
+                let predicates = CNContact.predicateForContactsInContainer(withIdentifier: container.identifier)
+                let request = CNContactFetchRequest(keysToFetch: keys as [CNKeyDescriptor])
+                request.mutableObjects = true
+                request.unifyResults = true
+                request.sortOrder = .userDefault
+                request.predicate = predicates
+                do {
+                    try self.store.enumerateContacts(with: request) { contact, _ in
+                        if !contact.emailAddresses.isEmpty {
+                            fetchedContacts.append(contact)
+                        } else {
+                            print(contact)
+                        }
                     }
+                } catch {
+                    print(error)
                 }
-            } catch {
-                print(error)
             }
+            return completionHandler(fetchedContacts)
         }
-
-
-        return fetchedContacts
     }
 
     public func importDeviceContacts() {