Как получить обновленный/добавленный/удаленный контакт с помощью CNContactStoreDidChangeNotification

Я сделал приложение, используя контакты из контактной книги.

Проблема: - я обновляю/добавляю/удаляю контакт из книги контактов, а затем возвращаюсь в свое приложение.

Мое приложение applicationDidBecomeActive активно пишет следующий код: -

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

После этого метод addressBookDidChange вызывается несколько раз, и пользовательский интерфейс приложения зависает. Я также пытался загрузить контакт в фоновом режиме, но приложение вылетало случайным образом.

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) метод получения контактов: -

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) После завершения этого метода обновите/добавьте контакт в локальную базу данных, используя базовую базу данных. Для добавления/обновления метода локальной базы данных имя метода «self.GetStoreConatcts(arrcontact)». В этом проходе один за другим контакт .Используя этот контакт, проверьте в БД, если он доступен, затем обновите контакт, а недоступен, затем добавьте контакт.

Я выполнил выше всех шагов, контакт также обновляет/добавляет/удаляет, но приложение аварийно завершает работу.

так что у кого-нибудь есть решение, как загрузить метод в фоновом режиме, пожалуйста, помогите мне.

Заранее спасибо.


person shraddha k vaishanani    schedule 12.09.2017    source источник
comment
Пожалуйста, обновите вопрос с помощью журнала сбоев и укажите, где произошел сбой. Так будет легко понять   -  person Austin Michael    schedule 12.09.2017


Ответы (1)


Попробуйте использовать библиотеку 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
    }
}
person Satish Babariya    schedule 12.09.2017
comment
Спасибо за ответ, и я попробую контакт SwiftyContacts. - person shraddha k vaishanani; 13.09.2017
comment
@ShraddhaVaishnani вы обновили/добавили/удалили контакт с помощью CNContactStoreDidChangeNotification? - person Nandhakumar Kittusamy; 28.02.2018
comment
@nandhaKumar, я не получаю особого добавления, обновления, удаления контакта с помощью структуры контактов. Если у вас есть какое-либо решение, пожалуйста, дайте мне. - person shraddha k vaishanani; 05.03.2018