2017-12-27 8 views
0

Firestoreを使用している関数からドキュメントを返したいとします。ここに私のクエリです:Firestoreでクエリを含むドキュメントを返します

public class func getProductsInShoppingList(name:String = "Default") -> DocumentSnapshot?{ 
    let db = Firestore.firestore() 

    let defaults = UserDefaults.standard 
    let userId: String! = defaults.string(forKey: "UserUUID") 

    var doc:DocumentSnapshot? 
    db.collection("shoppingLists") 
     .whereField("users." + userId, isEqualTo: true) 
     .whereField("name", isEqualTo: name) 
     .limit(to: 1) 
     .getDocuments() { (querySnapshot, err) in 
      if let err = err { 
       print("Error getting documents: \(err)") 
      } else { 
       for document in querySnapshot!.documents { 
        print("\(document.documentID) => \(document.data())") 
        doc = document 
        break 
       } 
      } 
    } 
    return doc 
} 

これは明らかに非同期操作です。文書を返却して使用する適切な方法は何ですか。お知らせ?折り返し電話?おかげDidLoadのよう

+0

を完了すると、それが

2番目のオプションを必要とされていない場合は データのロードを追加したオブザーバーを削除することを忘れないでください操作が完了し、必要な機能を呼び出すことができます –

答えて

1

は、通知のオブザーバーは、その通知を取得するとちょうど

override func viewDidLoad() 
    { 
     super.viewDidLoad() 

     //Add notification Observer to get status out of Async mode 
     NotificationCenter.default.addObserver(self, selector: #selector(loadList), name: NSNotification.Name(rawValue: "DocumentReceived"), object: nil) 

    } 

今、あなたの関数で

public class func getProductsInShoppingList(name:String = "Default") -> DocumentSnapshot?{ 
    let db = Firestore.firestore() 

    let defaults = UserDefaults.standard 
    let userId: String! = defaults.string(forKey: "UserUUID") 

    var doc:DocumentSnapshot? 
    db.collection("shoppingLists") 
     .whereField("users." + userId, isEqualTo: true) 
     .whereField("name", isEqualTo: name) 
     .limit(to: 1) 
     .getDocuments() { (querySnapshot, err) in 
      if let err = err { 
       print("Error getting documents: \(err)") 
      } else { 
       for document in querySnapshot!.documents { 
        print("\(document.documentID) => \(document.data())") 
        doc = document 
        NotificationCenter.default.post(name: NSNotification.Name(rawValue: "DocumentReceived"), object: nil) 
        break 
       } 
      } 
    } 
    return doc 
} 

としてオブザーバーを追加する - このように、必要な機能は

自体に呼び出されます
@objc func loadList(){ 
     //load data here  
    } 

- 操作は、あなただけが通知されますあなたはnotificationObserverを利用することができる一つの文書を取得し、ここで

public class func getProductsInShoppingList(name:String = "Default") -> DocumentSnapshot?{ 
      let db = Firestore.firestore() 

      let defaults = UserDefaults.standard 
      let userId: String! = defaults.string(forKey: "UserUUID") 

      var doc:DocumentSnapshot? 
      db.collection("shoppingLists") 
       .whereField("users." + userId, isEqualTo: true) 
       .whereField("name", isEqualTo: name) 
       .limit(to: 1) 
       .getDocuments() { (querySnapshot, err) in 
        if let err = err { 
         print("Error getting documents: \(err)") 
        } else { 
         for document in querySnapshot!.documents { 
          print("\(document.documentID) => \(document.data())") 
          doc = document 
          DispatchQueue.main.async { 
           //Load data here 
          } 
          break 
         } 
        } 
      } 
      return doc 
     } 
+0

この方法は、私の機能が同じクラスにあると仮定しています。私はドキュメントを返すサービスクラスを持っています。私はコントローラにこの機能を入れることができますが、そうしないことを望んでいました。 – jimijon

+0

あなたはnotificationObserverを使用することができます。つまり、通知のuserInfoを使用してデータ –

+0

をロードするよう通知を更新するだけで、どのクラスでもデータを取得できます。私は私の通知のユーザー情報の辞書に自分のオブジェクトを割り当てました。親クラスのオブザーバ関数が通知パラメータを介して渡されました。 – jimijon

関連する問題