CNContactStore联系人记录的计数

i-k*_*nov 6 ios cncontact cncontactstore

我需要获取用户设备上所有联系人的号码.ABAddressBookGetPersonCount上的弃用消息说:

使用带有谓词= 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);
}
Run Code Online (Sandbox Code Playgroud)

然而,就性能而言,这看起来很糟糕.我还没有找到另一种获取计数而不枚举CNContact对象的方法.我错过了什么吗?

先感谢您!

hap*_*384 2

这是旧的,但万一其他人偶然发现它,可以通过使用 0 个键来获取而不是 1 进行枚举来完成。

__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);
}
Run Code Online (Sandbox Code Playgroud)

使用 0 个按键,我能够在 0.8 秒内对具有 10,000 个联系人的设备进行计数(而使用 1 个按键则需要 14 秒)。