我正在使用Xcode 7.3和Swift 2.2。我试图获取设备的所有联系人并将其存储在一个数组中。它在模拟器上工作正常但在设备上测试时非常慢(有378个联系人)。这需要大约20-25秒。我提出了各种断点,并注意到从手机中取出联系人需要花费最多时间。使用表视图显示已创建阵列中的联系人根本不需要时间。这是我的代码,
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")
}
}
这就是我填充表格视图的方式。
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
}
在Debug Navigator中,CPU也达到了98-99%,Energy Impact - Very High。一旦获取了联系人,它们就会恢复正常值。
事实证明,获取CNContactPhoneNumbersKey需要花费很多时间。只需获取CNContactGivenNameKey即可。(2-3秒)。我们有解决方案吗?
答案 0 :(得分:1)
框架或代码没有任何问题。我在其他设备上测试了代码,并且工作正常。它能够在不到一秒的时间内获得接近900个联系人。
所以问题是特定于设备并重新安装iOS并在新iPhone解决问题时恢复设备。
如果其他人遇到类似问题,只需备份重要内容(例如联系人,照片等)并重新安装iOS并将设备恢复为新iPhone。