CNContactStore:删除和插入大量联系人时出错

问题描述

我正在实现从备份中恢复联系人的功能。我遇到了大量联系人 (> 1000) 的问题,通常 try store.execute (saveRequest) 会出错。

private func recoveryContacts(_ contacts: [CNContacts],completion: ((Result<Bool,Error>) -> Void)?) {
    var availableRecoveryAttempt = 3
    var fetchedContacts = contactFetcher.fetch()
    repeat {
        deleteallContacts()
        saveContacts(contacts)
        availableRecoveryAttempt -= 1
        fetchedContacts = contactFetcher.fetch()
    } while (fetchedContacts.count != contacts.count) && (availableRecoveryAttempt != 0)
    completion?(.success(fetchedContacts.count == contacts.count))
}

private func deleteallContacts() {
    let saveRequest = CNSaveRequest()
    var contacts = contactFetcher.fetch()
    contacts
        .compactMap { $0.mutablecopy() as? CNMutableContact }
        .forEach { saveRequest.delete($0) }
    do {
        try store.execute(saveRequest)
    } catch {
        print(error)
    }
}
    
private func saveContacts(_ contacts: [CNContact]) {
    let saveRequest = CNSaveRequest()
    let containerId = store.defaultContainerIdentifier()
    contacts
        .compactMap { $0.mutablecopy() as? CNMutableContact }
        .forEach { saveRequest.add($0,toContainerWithIdentifier: containerId) }
    do {
        try store.execute(saveRequest) // this generate error 
    } catch {
        print(error)
    }
}

错误

Error Domain=CNErrorDomain Code=1 "Communication Error" UserInfo={NSLocalizedDescription=Communication Error,NSLocalizedFailureReason=An error occurred while trying to communicate with the Contacts service.}

//和

Error Domain=CNErrorDomain Code=2 "(null)"

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)