連絡先の連絡先を使用してアプリを作成しました。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をチェックし、連絡先を更新して利用できない場合は連絡先を追加してください。
私は上記のすべての手順にも、更新/追加/削除にも連絡しますが、アプリクラッシュはランダムに行います。
誰でも方法をバックグラウンドでロードする方法のソリューションを持っているので、私を助けてください。
ありがとうございます。
を追加削除、バックグラウンドスレッド
の連絡先を取得し、クラッシュLOとの質問を更新してくださいgとそれが墜落した場所に言及してください。だからそれは理解しやすいでしょう –