2017-09-12 24 views
2

連絡先の連絡先を使用してアプリを作成しました。CNContactStoreDidChangeNotificationを使用して更新/追加/削除された連絡先を取得する方法

問題: - 私は連絡先の本から連絡先を更新/追加/削除してから、自分のアプリに戻します。

マイアプリ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)終了後このメソッドの更新/コアデータベースを使用してローカルDbの連絡先を追加します。add/updateローカルDbメソッド名は "self.GetStoreConatcts(arrcontact) "このパスでは1つ1つの連絡先を使用します。この連絡先を使用できる場合はdbをチェックし、連絡先を更新して利用できない場合は連絡先を追加してください。

私は上記のすべての手順にも、更新/追加/削除にも連絡しますが、アプリクラッシュはランダムに行います。

誰でも方法をバックグラウンドでロードする方法のソリューションを持っているので、私を助けてください。

ありがとうございます。

+0

を追加削除、バックグラウンドスレッド

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 } }) 

の連絡先を取得し、クラッシュLOとの質問を更新してくださいgとそれが墜落した場所に言及してください。だからそれは理解しやすいでしょう –

答えて

1

SwiftyContacts Cocoapodsライブラリを使用してみてください。

https://cocoapods.org/pods/SwiftyContacts

問い合わせ

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 
    } 
} 
+0

答えをありがとうと私はSwiftyContacts連絡先を試してみます。 –

+0

あなたのソリューションがうまく機能してくれてありがとうございました。 –

+0

@ShraddhaVaishnani CNContactStoreDidChangeNotificationを使用して更新/追加/削除された連絡先を取得しましたか? – NandhaKumar

関連する問題