如何使用 CNContactStoreDidChangeNotification 获取 updated/added/deleted 联系人

How to Get updated/added/deleted contact using CNContactStoreDidChangeNotification

我使用通讯录联系人制作了应用程序。

问题:- 我 update/add/delete 从通讯录联系然后回到我的应用程序。

我的应用程序 applicationDidBecomeActive 主动编写以下代码:-

NotificationCenter.default.addObserver(
        self,
        selector: #selector(self.addressBookDidChange),
        name: NSNotification.Name.CNContactStoreDidChange,
        object: nil)

多次调用 addressBookDidChange 方法后 App UI 冻结。 我也尝试在后台加载联系人,但应用程序随机崩溃。

1) 联系数组声明:-

 public var GlobalContactArray = [ContactEntry]()

2) 在后台加载联系人:-

    DispatchQueue.main.async
    {

            PKHUD.sharedHUD.contentView = PKHUDProgressView()
            PKHUD.sharedHUD.show()

    }

   DispatchQueue.global(qos: .background).async
   {
        self.requestAccessToContacts
        { (success) in
            if success
            {
                self.retrieveContacts({ (success, contacts ) in

                    if success && (contacts?.count)! > 0
                    {
                        self.GlobalContactArray = contacts!

                        for arrcontact in contacts!
                        {
                            self.GetStoreConatcts(arrcontact)
                        }

                     }
                })
            }
        }
    }

3) retrieveContacts 方法:-

self.GlobalContactArray.removeAll()


        do
        {
            let contactsFetchRequest = CNContactFetchRequest(keysToFetch: [CNContactGivenNameKey as CNKeyDescriptor, CNContactFamilyNameKey as CNKeyDescriptor, CNContactImageDataKey as CNKeyDescriptor, CNContactImageDataAvailableKey as CNKeyDescriptor, CNContactPhoneNumbersKey as CNKeyDescriptor, CNContactEmailAddressesKey as CNKeyDescriptor])
            try contactStore.enumerateContacts(with: contactsFetchRequest, usingBlock:
            {
                (cnContact, error) in
                if let contact = ContactEntry(cnContact: cnContact)
                {
                    if self.GlobalContactArray.contains(contact)
                    {

                    }
                    else
                    {
                        self.GlobalContactArray.append(contact)
                    }


                }
            })

                if self.GlobalContactArray.count == 0
                {

                }
                else
                {
                    if Constants.isLogin == "1"
                    {
                        DispatchQueue.main.async
                        {
                            NotificationCenter.default.post(name: Notification.Name("LoadContactList"), object: nil)
                        }

                    }
                    else
                    {
                        UserDefaults.standard.set(true, forKey: "ContactViewDisapper")
                        UserDefaults.standard.synchronize()
                    }

                }

            completion(true, self.GlobalContactArray)
        }
        catch
        {
            completion(false, nil )
        }

4) 完成此方法后 update/add 使用核心在本地 Db 中联系 Database.For add/update 本地 Db 方法名称为“self.GetStoreConatcts( arrcontact)”。在此过程中,一个接一个 contact.Using 此联系人在数据库中检查是否可用,然后更新联系人,如果不可用,则添加联系人。

我按照上述所有步骤也联系了 update/add/delete 但应用程序随机崩溃。

所以谁有关于如何在后台加载方法的解决方案,请帮助我。

提前致谢。

尝试使用 SwiftyContacts Cocoapods 库。

https://cocoapods.org/pods/SwiftyContacts

在后台线程上获取联系人

fetchContactsOnBackgroundThread(completionHandler: { (result) in
    switch result{
        case .Success(response: let contacts):
            // Do your thing here with [CNContacts] array    
            break
        case .Error(error: let error):
            print(error)
            break
    }
})

添加联系人

let contact : CNMutableContact = CNMutableContact()
contact.givenName = "Satish"
// OR Use contact.mutableCopy() For Any CNContact

addContact(Contact: contact) { (result) in
    switch result{
        case .Success(response: let bool):
            if bool{
                print("Contact Sucessfully Added")
            }
            break
        case .Error(error: let error):
            print(error.localizedDescription)
            break
    }
}

删除联系人

// Use contact.mutableCopy() To convert CNContact to CNMutableContact
deleteContact(Contact: contact) { (result) in
    switch result{
        case .Success(response: let bool):
            if bool{
                print("Contact Sucessfully Deleted")
            }
            break
        case .Error(error: let error):
            print(error.localizedDescription)
            break
    }
}