我使用的是 Xcode 7.3 和 Swift 2.2。我正在尝试获取设备的所有联系人并将其存储在数组中。它在模拟器上运行良好,但在设备(具有 378 个触点)上测试时非常慢。完成此操作大约需要 20-25 秒。我设置了多个断点,发现从手机获取联系人需要花费最多时间。使用表格 View 显示创建的阵列中的联系人根本不需要时间。这是我的代码,
var results: [CNContact] = []
func retrieveContactsWithStore() {
let contactStore = CNContactStore()
var i = 0
var allContainers: [CNContainer] = []
do {
allContainers = try contactStore.containersMatchingPredicate(nil)
} catch {
print("Error fetching containers")
}
for container in allContainers {
let fetchPredicate = CNContact.predicateForContactsInContainerWithIdentifier(container.identifier)
do {
let containerResults = try contactStore.unifiedContactsMatchingPredicate(fetchPredicate, keysToFetch: [
CNContactGivenNameKey, CNContactFamilyNameKey, CNContactPhoneNumbersKey])
results.appendContentsOf(containerResults)
} catch {
print("Error fetching results for container")
}
}
这就是我填充表格 View 的方式。
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)
cell.textLabel?.text = results[indexPath.row].givenName
cell.detailTextLabel?.text = ((results[indexPath.row].phoneNumbers[0].value as? CNPhoneNumber)?.valueForKey("digits") as? String)
return cell
}
在调试导航器中,CPU 利用率也飙升至 98-99%,能源影响 - 非常高。获取联系人后,这些值将返回正常值。
事实证明,获取 CNContactPhoneNumbersKey 需要花费很多时间。只需获取 CNContactGivenNameKey 就可以很快。(2-3 秒)。我们有解决办法吗?
最佳答案
框架或代码没有任何问题。我在其他设备上测试了代码,效果很好。它能够在不到一秒的时间内获取近 900 个联系人。
所以问题是特定于设备的,重新安装 iOS 并恢复设备作为新 iPhone 解决了该问题。
如果其他人遇到类似问题,只需备份您的重要内容(例如联系人、照片等)并重新安装 iOS 并将设备恢复为新 iPhone。
关于ios - 使用联系人框架缓慢获取联系人,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37940689/