2

タイトルのように、電話番号でデバイスのアドレス帳から連絡先を見つけるための最良かつ効率的な方法は何ですか?実際、私は次のような方法を使用します。

注:
[rm getElencoContatti]アドレスブック内のすべての連絡先を
[contatto getID]返しますアドレスブックから連絡先IDを
[contatto getNumeriContatto]返しますアドレスブックからすべての連絡先の電話番号を返します

+(NSMutableDictionary *)getNomeContattoDaNumero:(NSString *)numeroTelefono {

    NSMutableDictionary *returnValue = [[NSMutableDictionary alloc]init];
    NSNumber *idContact;

    for(ContattoRubrica *contatto in [rm getElencoContatti]) {
        idContact = [contatto getID];
        for(id numero in [contatto getNumeriContatto]) {

            if([numeroTelefono isEqualToString:[numero objectForKey:@"numeroTelefono"]]) {

                [returnValue setValue:[contatto getNomeContatto] forKey:@"nome"];
                [returnValue setValue:idContact forKey:@"idContatto"];

                return returnValue;
            }
        }
    }

    [returnValue setValue:numeroTelefono forKey:@"nome"];
    [returnValue setValue:[NSNumber numberWithInt:-1] forKey:@"idContatto"];

    return returnValue;

}

この方法を約200の連絡先のアドレス帳でテストしましたが、この機能は非常に遅いです。これを自動的に行うABAddressbook.hメソッドはありますか?

前もって感謝します。

4

1 に答える 1

2

ABAddressBookiOS の は、Mac OS の同等の API よりも少ない検索機能を提供します。残念ながら、連絡先をフィルタリングするには、上に示したような線形スキャンが必要です。Apple のドキュメントには、ブロックベースの述語を使用したわずかに異なるアプローチが含まれていますが、基本的にここで行っていることと同じです。

考えられる高速化の 1 つは、検索を実行して一致するレコードContattoRubricaが見つかる (または見つからない) まで、すべてのオブジェクトを作成しないようにすることです。ABPersonどのような場合でも、Instruments を使用して、コードが最も多くの時間を費やしている場所を特定する必要があります。

于 2013-01-07T17:39:06.303 に答える