首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >联系记录的CNContactStore计数

联系记录的CNContactStore计数
EN

Stack Overflow用户
提问于 2016-04-18 13:34:53
回答 2查看 1.1K关注 0票数 7

我需要知道用户设备上所有联系人的号码。ABAddressBookGetPersonCount上的反对消息说:

使用谓词= nil的CNContactFetchRequest的提取结果计数

以下是我按照该指南所做的内容:

代码语言:javascript
复制
 __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对象的情况下,我还没有找到另一种获取计数的方法。我是不是遗漏了什么?

提前谢谢你!

EN

回答 2

Stack Overflow用户

发布于 2017-04-19 22:00:43

这是旧的,但如果其他人无意中发现它,可以通过使用0键的枚举来实现,而不是1。

代码语言:javascript
复制
__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秒)。

票数 2
EN

Stack Overflow用户

发布于 2017-06-29 05:10:03

Swift 3版本,打包成一个类函数。

代码语言:javascript
复制
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
}

通常,与其创建另一个联系人存储,不如重用一个联系人存储:

代码语言:javascript
复制
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
} 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36695582

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档