2016-06-21 4 views
3

私は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秒)。これに対する解決策はありますか?

答えて

1

フレームワークまたはコードに問題はありません。私は他のデバイス上のコードをテストし、正常に動作しました。約900件の連絡先を1秒未満で取り出すことができました。

問題はデバイス固有で、iOSを再インストールして新しいiPhoneとしてデバイスを復元することで問題が解決されました。

誰かが同様の問題に直面している場合は、重要なもの(連絡先、写真など)をバックアップし、iOSを再インストールして新しいiPhoneとしてデバイスを復元してください。

+0

Ouch。私のユーザーがやると思う何かのように見えません! – Randy

+0

これはユーザー固有のものです。開発者は何ができますか?しかし、恐ろしいUXになるだろう。 –

関連する問題