ios - How to Get updated/added/deleted contact using CNContactStoreDidChangeNotification -
i made app using contact book contacts.
problem:- update/add/delete contact contact book app.
my app applicationdidbecomeactive active write following code :-
notificationcenter.default.addobserver( self, selector: #selector(self.addressbookdidchange), name: nsnotification.name.cncontactstoredidchange, object: nil) after addressbookdidchange method called multiple times , app ui freeze. tried load contact in background app crash randomly.
1) contact array declaration :-
public var globalcontactarray = [contactentry]() 2)load contact in background :-
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! arrcontact in contacts! { self.getstoreconatcts(arrcontact) } } }) } } } 3) retrievecontacts method :-
self.globalcontactarray.removeall() { let contactsfetchrequest = cncontactfetchrequest(keystofetch: [cncontactgivennamekey cnkeydescriptor, cncontactfamilynamekey cnkeydescriptor, cncontactimagedatakey cnkeydescriptor, cncontactimagedataavailablekey cnkeydescriptor, cncontactphonenumberskey cnkeydescriptor, cncontactemailaddresseskey 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) after completion of method update/add contact in local db using core database.for add/update local db method name "self.getstoreconatcts(arrcontact)".in pass 1 one contact.using contact check in db if available update contact , not available add contact.
i followed above steps contact update/add/delete app crash randomly.
so have solution how load method in background please me.
thanks in advance.
try using swiftycontacts cocoapods library.
https://cocoapods.org/pods/swiftycontacts
fetch contacts on background thread
fetchcontactsonbackgroundthread(completionhandler: { (result) in switch result{ case .success(response: let contacts): // thing here [cncontacts] array break case .error(error: let error): print(error) break } }) add contact
let contact : cnmutablecontact = cnmutablecontact() contact.givenname = "satish" // or use contact.mutablecopy() 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 } } delete contact
// use contact.mutablecopy() convert cncontact 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 } }
Comments
Post a Comment