0

テーブルビューに連絡先の配列 ( [[ContactStore sharedStore]allContacts] ) を表示し、リストをアルファベットのセクションに分割しました。次のコードを使用して、連絡先の最初の文字の配列と、文字ごとのエントリ数の辞書を返しました。

    //create an array of the first letters of the names in the sharedStore
nameIndex = [[NSMutableArray alloc] init];

//create a dictionary to save the number of names for each first letter
nameIndexCount = [[NSMutableDictionary alloc]init];

for (int i=0; i<[[[ContactStore sharedStore]allContacts]count]; i++){

//Get the first letter and the name of each person
    Contact *p = [[[ContactStore sharedStore]allContacts]objectAtIndex:i];
    NSString *lastName = [p lastName];
    NSString *alphabet = [lastName substringToIndex:1];


    //If that letter is absent from the dictionary then add it and set its value as 1 
    if ([nameIndexCount objectForKey:alphabet] == nil) {
        [nameIndex addObject:alphabet];
        [nameIndexCount setValue:@"1" forKey:alphabet];
    //If its already present add one to its value
    } else {

        NSString *newValue = [NSString stringWithFormat:@"%d", ([[nameIndexCount valueForKey:alphabet] intValue] + 1)];

        [nameIndexCount setValue:newValue forKey:alphabet];
    }
} 

これは機能しますが、配列が大きい場合は非常に遅くなります。これを行うためのより良い方法があると確信していますが、私はこれに慣れていないため、方法がわかりません。これを行うためのより良い方法についての提案はありますか?

4

2 に答える 2

2

Bio Cho には良い点がありますが、呼び出すことでパフォーマンスが向上する場合があります。

[[ContactStore sharedStore]allContacts]

1回だけ。例えば:

nameIndex = [[NSMutableArray alloc] init];
nameIndexCount = [[NSMutableDictionary alloc] init];

/*
 Create our own copy of the contacts only once and reuse it
 */
NSArray* allContacts = [[ContactStore sharedStore] allContacts];

for (int i=0; i<[allContacts count]; i++){
    //Get the first letter and the name of each person
    Contact *p = allContacts[i];
    NSString *lastName = [p lastName];
    NSString *alphabet = [lastName substringToIndex:1];

    //If that letter is absent from the dictionary then add it and set its value as 1 
    if ([nameIndexCount objectForKey:alphabet] == nil) {
        [nameIndex addObject:alphabet];
        [nameIndexCount setValue:@"1" forKey:alphabet];
    //If its already present add one to its value
    } else {
        NSString *newValue = [NSString stringWithFormat:@"%d", ([[nameIndexCount 
            valueForKey:alphabet] intValue] + 1)];

        [nameIndexCount setValue:newValue forKey:alphabet];
    }
} 

確かなことは言えませんが、共有ストアに繰り返しアクセスすることがあなたの命を奪っていると思います。おそらく、一度アクセスするだけで、必要なものが得られます。

于 2013-01-07T02:42:31.827 に答える
0

連絡先を Core Data に保存し、NSFetchedResultsController を使用することを検討してください。

NSFetchedResultsController は、テーブル ビューに表示されている行のサブセットのみをロードするため、ユーザーはすべての連絡先が並べ替えられるのを待つ必要がなくなります。

NSFetchedResultsController は、連絡先を属性 (名または姓) でソートすることもできます。また、セクションのタイトルを、ソートするフィールドの最初の文字に設定することもできます。

この質問とこのチュートリアルを見てください。

于 2013-01-07T02:30:36.443 に答える