2

私は、データベース(herokuによってホストされているParse-server)からデータを取り出し、それを配列に追加するようにクエリを設定しました。このクエリ内の別のクエリは、別のクラスから情報を取得するために使用されますが、別の配列を追加するためにも使用されます。私は.findObjectsinBackgroundを使用しているため、非同期的に発生し、問題につながると思います。ここでは、コード(一般)は、次のとおりです。追加機能の非同期性を修正するにはどうすればいいですか?

func getQueries(completion: (() -> Void)?){ 

     let searchQuery = PFQuery(className: "Etc")   
     searchQuery.findObjectsInBackground(block: { (objects, error) in 

      if let objectss = objects{ 

       for object in objectss { 
        //append some arrays 
        let otherQuery = PFQuery(className: "OtherClass") 
        otherQuery.whereKey("user", equalTo: object["User"] as String) 
        otherQuery.findObjectsInBackground(block: {(objects, error) in 
         if let objectss = objects{ 
          for object in objectss{ 
           array.append(object["ProfPic"] as PFFile) 
           print("\(array) and its count is \(array.count)") //this returns a non 0 value 
          } 
         } 
         completion!() 
        }) 

      print("\(array) and its count is \(array.count)") //this returns 0 
       } 
      } 
     }) 
    } 

arrayのカウントは、それが自身の閉鎖に追加された後に非0と返されますが、その閉鎖の0外として返されます。これは、配列が情報を表示するために反復処理に使用されるため、問題です。とにかくsearchQueryの全体的な閉鎖が完了する前に、otherQueryの追加が既に完了していることを確認するにはありますか? (また、非同期的に問題が発生しているという事実は推測です...間違っている可能性があります)

答えて

1

後者の場合、データが取り出されるまでにカウントが表示されます。完了ブロックの外側にはfindObjectsInBackgroundがあります。

あなたは完了ブロックで独自の方法で全体を包むことができます。

func fetchData(_ completion:() -> Void) { 

    searchQuery.findObjectsInBackground(block: { (objects, error) in 
     guard let objectss = objects else { 
      completion() 
     } 

     for object in objectss { 
      let otherQuery = PFQuery(className: "OtherClass") 
      otherQuery.whereKey("user", equalTo: object["User"] as String) 
      otherQuery.findObjectsInBackground(block: {(objects, error) in 

       guard let objectss = objects else { 
        completion() 
       } 

       for object in objectss{ 
        array.append(object["ProfPic"] as PFFile) 
       } 

       print("In loop: \(array) and its count is \(array.count)")     
       completion() 
      }) 
     } 
    }) 
} 

そして、すべてよりも、それは次のように:

fetchData() { 
    print("After completing: \(array) and its count is \(array.count)") 
    // do stuff with your fetched data and display it 
    // "use in iterating through to display information" here 
} 

更新:あなたは

あなたが成功した場合にcompletion!()を呼び出している更新された質問。あなたはどのような場合には、それを呼び出す必要があります:!

... 
if let objectss = objects 
    ... 
    completion!() 
} else { 
    completion!() 
} 
... 
+0

shallowThought、私はあなたが編集した質問のコードブロックを見て(提案何をしようとした...私は '完了を置く()'そこに...それを常に関数にラップされていた、私はそのビットを表示していない)。しかし、2番目のprint文は0を返しています。 –

+0

書かれているように、データを取得する前にカウントを表示しています。あなたの 'print()'ステートメントを補完ブロック(または 'completion!()'の前に置きます。私の編集された答えのように。 – shallowThought

関連する問題