2009-08-21 14 views
3

連絡先の電話番号を対応するABRecordRefにマッピングするルックアップテーブルを作成しています(ユーザーがダイヤルした電話番号に基づいて連絡先の名前と写真を効率的に検索できます)。iPhoneで読む際のパフォーマンス上の問題

残念ながら、500件の連絡先では、すべての連絡先をループしてルックアップテーブルを作成するために約4秒かかるため、アプリケーションの読み込みが非常に遅くなります。

他に他の人がこのような問題を見たことがありますか、または推奨される対処方法がありますか?

OS V3.0を実行している3G iPhoneでテストしています。このプロジェクトはターゲット 'Device 2.1'用に構築されています。ループのみ(ABAddressBookCopyArrayOfAllPeopleを含む)を実行するために0.2〜0.75秒を要する前

ABAddressBookRef lAddressBook = ABAddressBookCreate(); 

CFArrayRef lRawAddressBookEntries = 
          ABAddressBookCopyArrayOfAllPeople(lAddressBook); 

static NSMutableDictionary sCustomAddressBookPersonRefs = 
         [[NSMutableDictionary alloc] initWithCapacity:1000]; 

CFIndex lTotalContactsCount = ABAddressBookGetPersonCount(lAddressBook); 

/*************************************************************************/ 
/* Loop through all the contacts storing a pointer to the address book */ 
/* entry for each phone number.           */ 
/*************************************************************************/ 
for (CFIndex i = 0; i < lTotalContactsCount; i++) 
{ 
    ABRecordRef lRef = CFArrayGetValueAtIndex(lRawAddressBookEntries, i); 

    ABMultiValueRef lPhoneNumbers = ABRecordCopyValue(lRef, 
                kABPersonPhoneProperty); 

    CFIndex lContactPhoneNumberCount = ABMultiValueGetCount(lPhoneNumbers); 

    /***********************************************************************/ 
    /* Loop through all the phone numbers available for this contact.  */ 
    /***********************************************************************/ 
    for (int j = 0; j < lContactPhoneNumberCount; j++) 
    { 
    /*********************************************************************/ 
    /* Get the next phone number and remove the formatting.    */ 
    /*********************************************************************/ 
    CFStringRef lPhoneNumber = 
     ABMultiValueCopyValueAtIndex(lPhoneNumbers, j); 

    [sCustomAddressBookPersonRefs setValue:(id)lRef 
            forKey:(NSString *)lPhoneNumber]; 

    CFRelease(lPhoneNumber); 
    }  

    CFRelease(lRef); 
    CFRelease(lPhoneNumbers); 
} 

CFRelease(lRawAddressBookEntries); 

コードの最初の部分:ここ

コードです。

外側のforループには最初にNSLog行が1つしかありませんでしたが、デバイスでテストする前に前処理しました。

問題を見てから、私はすべてのコード行の間にNSLog行を置いていて、行のどれもが他のものよりかなり長い遅延を引き起こすように見えませんでした。ルックアップテーブルを作成するためにそれらのトレースラインがすべて50秒かかるので、各ラインは約0.01秒で出力され、時折0.1〜0.2秒の遅延があります(毎回同じコード行ではありません)。

いずれかのアイデアをいただければ幸いです!

私はLeaksチェッカーを実行しているので、メモリ管理ミスはありません。電話番号に基づいて連絡先を個別に検索する方法もないようです。

(2009年11月第2回)私は今、この問題のためにAppleとバグを提起している:
-BugのID#7357996(パフォーマンス) - ABAddressBook SDKのAPIはひどいパフォーマンス
-BugのID#7357980(強化)を持っている - ABAddressBookを提供電話番号に基づいて連絡先を検索する方法がありません

+0

アップルは私に、バグID#7357996は、技術者が調査している既知のバグID#5721841の複製であることを教えてくれます。 –

答えて

6

ルーティンを最適化できない場合は、読み込みのために新しいスレッドをフォークすることもできます。その後、アプリケーションは読み込みを続行し、ユーザーに対して応答します。

[NSThread detachNewThreadSelector:@selector(_loadContactsInAnotherThread:) toTarget:self withObject:self]; 

-(void)loadContactsInAnotherThread:(void *)obj 
{ 
    NSLog("Do time intensive stuff here."); 
} 
+0

ありがとう、これはうまく動作するようです。私はいくつかの並行処理のバグが出てきていると確信していますが、今のところ良くなっています... –

+0

コードと回答の両方におかげさしです! – Martin

1

本当に答えはありません。私はAppStoreにダイヤラタイプのアプリを持っており、私のアプリは同じ問題を抱えています。 AB APIは実際に連絡先クエリの点で制限されています。あなたができる最善の方法は、待ち時間を少なくするためにアニメーションの一部をコーディングすることです。

関連する問題