2017-05-18 5 views
0

Appleの開発者向けドキュメントで次のコードを見つけましたが、この機能を正しく呼び出す方法を理解できません。どんな指導にも本当に感謝します。swiftを使用してiOSグループに所属する連絡先を一覧表示する方法

func fetchContactsInGroup(with identifier: String, completion: @escaping (_ contacts: [CNContact]) -> Void) { 
    var result = [CNContact]() 
    // Fetch only the full name of a person or organization. 
    let request = CNContactFetchRequest(keysToFetch: [CNContactFormatter.descriptorForRequiredKeys(for: .fullName)]) 

    // Predicate to fetch all contacts that are members of the specified group. 
    request.predicate = CNContact.predicateForContactsInGroup(withIdentifier: identifier) 

    contactStoreQueue.async { 
     do { 
      try self.store.enumerateContacts(with: request, usingBlock: {(contact, status) -> Void in 
       // Add each retured contact to result. 
       result.append(contact) 
      }) 
     } catch let error as NSError { 
      print("Error \(error.localizedDescription)") 
     } 

     DispatchQueue.main.async { 
      completion(result) 
     } 
    } 
} 
+0

どの部分が正確に手に入らないのですか? – Losiowaty

+0

func fetchContactsInGroupを呼び出すための構文 - 完了:ビットが私の問題 – Jeremy

答えて

0

いいえ、あなたの問題はブロックであると思われます。今

fetchContactsInGroup(with: "groupName") { (retrievedContacts:[CNContact]) in 
    // your code to proccess retrievedContacts goes here 
} 

、ビットを説明するために: - 単にに変数に格納されたコードのブロックを置くこのcompletionパラメータが閉鎖され、このメソッドを呼び出すための最も簡単な方法は、このようなものです。これはiOS SDKのかなり一般的なパターンなので、あなたはそれについて学ぶことをお勧めします。メソッド自体が非同期に連絡先を取得するため、このブロックが渡されます。終了すると、渡されたコードブロックが呼び出されます。これは将来起こりうることを覚えておくことが重要です。連絡先がメインスレッドで同期的に取得された場合、アプリがハングアップしているという印象を受けます。
これは非常に簡単な説明、here is a documentation about closures in Swiftです。私はそれを徹底的に読むことを強くお勧めします。クロージャー/ラムダを使用する前に把握するのは簡単ではないかもしれませんが、実際にはそれに慣れるべきです。

+0

本当に役に立ちます - ありがとう – Jeremy

+0

これは[CNContact]でうまくいきましたが、私が定義したタイプに変更してこのエラーを取得する必要がありました /Users/[(ContactEntry?) - > Void)型の値を変換できません。型 '(別名\'(((アルファ))/ ARUA/ControlRoom/ControlRoom/Contacts.swift:72:期待される引数型 '([ContactEntry]?) - > Void'に 'をタイプしてください) 私は明らかに何かがありません。 ガイダンスに感謝します – Jeremy

+0

通常、2つの任意のタイプの間で変換することはできません。あなたはシステムから連絡先を取得し、システムはあなたのクラスについて何も知らない。コンプリートブロック内の 'CNContact'から' ContactEntry'に手動で変換する必要があります。 – Losiowaty

関連する問題