7

ユーザーのデバイス上のすべての連絡先の数を取得する必要があります。ABAddressBookGetPersonCount の非推奨メッセージには次のように記載されています。

predicate = nil の CNContactFetchRequest のフェッチ結果のカウントを使用する

そのガイダンスに従って私が作ったものは次のとおりです。

 __block NSUInteger contactsCount = 0;

NSError *error;
CNContactFetchRequest *request = [[CNContactFetchRequest alloc] initWithKeysToFetch:@[CNContactGivenNameKey]];
BOOL success = [self.contactStore enumerateContactsWithFetchRequest:request error:&error
                                                         usingBlock:^(CNContact * _Nonnull contact, BOOL * _Nonnull stop) {
                                                             contactsCount += 1;
                                                         }];
if (!success || error) {
    NSLog(@"error counting all contacts, error - %@", error.localizedDescription);
}

しかし、これはパフォーマンスの面でひどいようです。CNContact オブジェクトを列挙せずにカウントを取得する別の方法は見つかりませんでした。何か不足していますか?

前もって感謝します!

4

2 に答える 2

2

これは古いものですが、他の誰かがこれに出くわした場合に備えて、取得するキーを 1 ではなく 0 で列挙することで実現できます。

__block NSUInteger contactsCount = 0;

NSError *error;
CNContactFetchRequest *request = [[CNContactFetchRequest alloc] initWithKeysToFetch:@[]];
BOOL success = [self.contactStore enumerateContactsWithFetchRequest:request error:&error
                                                     usingBlock:^(CNContact * _Nonnull contact, BOOL * _Nonnull stop) {
                                                         contactsCount += 1;
                                                     }];
if (!success || error) {
   NSLog(@"error counting all contacts, error - %@", error.localizedDescription);
}

キーが 0 の場合、10,000 の連絡先を持つデバイスで 0.8 秒でカウントを実行できました (キーが 1 の場合は 14 秒かかりました)。

于 2017-04-19T22:00:43.447 に答える