私は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
}
また、デバッグナビゲータでは、CPUが98~99%に上昇し、エネルギーへの影響が非常に高い。連絡先が取得されると、これらは通常の値に戻ります。
CNContactPhoneNumbersKeyの取得には時間がかかります。 CNContactGivenNameKeyを取得するだけで簡単です(2〜3秒)。これに対する解決策はありますか?
Ouch。私のユーザーがやると思う何かのように見えません! – Randy
これはユーザー固有のものです。開発者は何ができますか?しかし、恐ろしいUXになるだろう。 –