2016-04-18 16 views
5

Tôi cần lấy số lượng tất cả địa chỉ liên hệ trên thiết bị của người dùng. Thông điệp deprecation trên ABAddressBookGetPersonCount nói: đếmCNContactStore Số lượng hồ sơ liên lạc

sử dụng lấy kết quả cho CNContactFetchRequest với vị ngữ = nil

Dưới đây là những gì tôi đã quyết sau đây hướng dẫn rằng:

__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); 
} 

Tuy nhiên ngoại hình này khủng khiếp về hiệu suất. Tôi đã không tìm thấy một cách khác để nhận số đếm mà không liệt kê các đối tượng CNContact. Tui bỏ lỡ điều gì vậy?

Cảm ơn bạn trước!

+0

thế nào là mã bất cứ điều gì của bạn như đề nghị trong thông điệp deprecation? – trojanfoe

+0

Có cách nào khác để thực hiện một CNContactFetchRequest không? –

Trả lời

2

Đây là cũ, nhưng trong trường hợp bất cứ ai tình cờ khác theo nó, nó có thể được thực hiện bằng cách làm như liệt kê với 0 chìa khóa để lấy thay vì 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); 
} 

Với 0 phím, tôi đã có thể chạy số lượng trên một thiết bị với 10.000 số liên lạc trong 0,8 giây (trong khi nó mất 14 giây với 1 phím).

+0

Đó thực sự là một điểm rất tốt! Tôi vẫn muốn Apple thêm một cách hợp pháp để có số này. Ingurss một tài sản lưu trữ đơn giản sẽ là cách thích hợp duy nhất để đi. Cám ơn lần nữa về sự chuyên sâu. –

0

Phiên bản Swift 3, được đóng gói dưới dạng chức năng Lớp.

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 
} 

Thường thì nó sẽ được tốt hơn để tái sử dụng một cửa hàng tiếp xúc hơn tạo ra một số khác:

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 
} 
Các vấn đề liên quan