我需要知道用户设备上所有联系人的号码。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);
}然而,就性能而言,这看起来很糟糕。在不枚举CNContact对象的情况下,我还没有找到另一种获取计数的方法。我是不是遗漏了什么?
提前谢谢你!
发布于 2017-04-19 22:00:43
这是旧的,但如果其他人无意中发现它,可以通过使用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);
}使用0键,我能够在一个拥有10,000个联系人的设备上运行计数,时间为0.8秒(而使用1键则需要14秒)。
发布于 2017-06-29 05:10:03
Swift 3版本,打包成一个类函数。
class func contactCount() -> Int? {
let contactStore = CNContactStore()
var contactsCount: Int = 0
let contactFetchRequest = CNContactFetchRequest(keysToFetch: [])
do {
try contactStore.enumerateContacts(with: contactFetchRequest) { (contact, error) in
contactsCount += 1
}
} catch {
print("Error counting all contacts.\nError: \(error)")
return nil
}
return contactsCount
}通常,与其创建另一个联系人存储,不如重用一个联系人存储:
class func contactCount(store: CNContactStore?) -> Int? {
let contactStore: CNContactStore
if let suppliedStore = store {
contactStore = suppliedStore
} else {
contactStore = CNContactStore()
}
var contactsCount: Int = 0
let contactFetchRequest = CNContactFetchRequest(keysToFetch: [])
do {
try contactStore.enumerateContacts(with: contactFetchRequest) { (contact, error) in
contactsCount += 1
}
} catch {
print("Error counting all contacts.\nError: \(error)")
return nil
}
return contactsCount
} https://stackoverflow.com/questions/36695582
复制相似问题