2016-12-16 148 views
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

在後面的例子中,您正在打印計數bofore數據被提取,例如,在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,我試圖做你的建議(看看編輯的問題代碼塊......我把'完成()'在那裏...它總是被封裝在一個函數中,我只是沒有顯示那一點)。但是,第二個打印語句仍然返回0.任何想法? –

+0

按照書面說明,您正在打印數據之前的計數。把你的'print()'語句放到你的完成塊中(或者在完成!()'調用之前)。正如我編輯的答案。 – shallowThought