Как проверить, был ли обновлен конкретный контакт в адресной книге, и отразить это в приложении? - PullRequest
0 голосов
/ 04 июля 2018

Привет, приложение. Я получаю контакты из адресной книги и, как только они обновляются, хранит ее. Db. Это код для получения всех контактов из адресной книги.

func getAllContactsFromAddressBook() {
    do {
        let contactsFetchRequest = CNContactFetchRequest(keysToFetch: [CNContactGivenNameKey as NSString,
                                                                       CNContactFamilyNameKey as NSString,
                                                                       CNContactImageDataKey as NSString,
                                                                       CNContactImageDataAvailableKey as NSString,
                                                                       CNContactPhoneNumbersKey as NSString,
                                                                       CNContactEmailAddressesKey as NSString,
                                                                       CNContactOrganizationNameKey as NSString,
                                                                       CNContactJobTitleKey as NSString,
                                                                       CNContactSocialProfilesKey as NSString ])
        try store.enumerateContacts(with: contactsFetchRequest, usingBlock: { (cnContact, error) in

        if cnContact.givenName == "", cnContact.familyName == "", cnContact.emailAddresses.count == 0 {
        } else {
            if realmStore.findContact(byId: cnContact.identifier) == nil {
                let contact = Contact()
                contact.id = cnContact.identifier
                _ = realmStore.create(contact: contact)
            }
            if let contact = realmStore.findContact(byId: cnContact.identifier) {
                do {
                    try realmStore.write {
                        contact.firstName = cnContact.givenName
                        contact.lastName = cnContact.familyName
                        contact.phoneNumber.removeAll()
                        contact.phoneNumber.append(objectsIn: cnContact.phoneNumbers.map({
                            let p = PhoneNumber()
                            p.phoneNumber = $0.value.stringValue
                            return p
                        }))
                        contact.email.removeAll()
                        contact.email.append(objectsIn: cnContact.emailAddresses.map({
                            let e = Email()
                            let email = $0.value as String
                            e.email = email == "" ? nil : email
                            return e
                        }))
                        contact.organization = cnContact.organizationName
                        contact.jobTitle = cnContact.jobTitle
                        contact.fromLinkedIn = cnContact.socialProfiles.filter({ $0.value.service == "LinkedIn" ? true : false }).first != nil ? true : false
                        if cnContact.imageDataAvailable == true {
                            contact.profileImageBlob = cnContact.imageData
                        }
                    }

                    contact.updatePriortyScore()
                }
                catch {
                    print("Couldn't update contact")
                }
            }




        }
    })
} catch {
    print(error)
}
}

Выборка контактов работает нормально, но каждый раз, когда загружается представление, происходит выборка всего списка контактов из адресной книги, что занимает время, поэтому есть способ, который уведомит меня о конкретном контакте в адресе, который был изменен, или если новый контакт был добавлен в адресную книгу, чтобы можно было обновлять список областей.

...