2016-04-18 10 views
5

ユーザーのデバイス上のすべての連絡先の番号を取得する必要があります。 ABAddressBookGetPersonCount上の非推奨のメッセージは言う:ここ連絡先レコードのCNContactStore件数

は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オブジェクトを列挙せずにカウントを取得する別の方法は見つかりませんでした。何か不足していますか?

ありがとうございます!

+0

:別のものを作成するよりも、

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 } 

多くの場合、連絡先ストアを再利用する方がよいでしょうか? – trojanfoe

+0

CNContactFetchRequestを実行する別の方法はありますか? –

答えて

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

をフェッチするために0キーで列挙を行うことによって達成することができる場合には、私は実行することができました0.8秒で1万人のコンタクトを持つデバイスの数です(1キーで14秒かかりました)。

+0

これは実際には非常に良い点です!私はまだアップルがこの数を収める正当な方法を追加したいと思う。単純なキャッシュされたプロパティは、唯一の正しい方法です。洞察のためにもう一度感謝します。 –

0

Swift 3バージョン、クラス機能としてパッケージ化されています。

あなたのコードは、非推奨のメッセージでの提案のようなものである方法
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 
}