2014-06-29 38 views
1

我有這樣的查詢parse.com。 爲什麼numObjects變量具有findObjectsInBackgroundWithBlock內側和功能不同的值離開Swift,parse.com:如何通過查詢傳遞數據

func searchUserInParse() -> Int { 

    var numObjects : Int = 0 // the num return objects from query 

    var query = PFQuery(className:"Bets") 
    query.whereKey("user", equalTo: "Bob") 
    query.findObjectsInBackgroundWithBlock { 
     (objects: AnyObject[]!, error: NSError!) -> Void in 
     if !error { 
      numObjects = objects.count 
      println(numObjects) // at this point the value = 1 
     } else { 
      // Log details of the failure 
      NSLog("Error: %@ %@", error, error.userInfo) 
     } 
    } 
    println(numObjects) // at this point the value = 0 

    return numObjects 
} 
+0

這是因爲塊在後臺線程上異步運行(查看方法名稱)。由於它是異步的,它會立即返回並在它後面繼續執行代碼。這意味着在上面的代碼塊之前調用第二個'println(numObjects)'。 – Milo

回答

4

而不是使用findObjectsInBackgroundWithBlock其中異步運行的,請嘗試使用findObjects它運行同步:運行你的函數時

//Set up query... 
var objects = query.findObjects() 
numObjects = objects.count 
println(numObjects) 

然後,做它像這樣:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) { 
    //Search users 
    searchUserInParse() 

    dispatch_async(dispatch_get_main_queue()) { 
     //Show number of objects etc. 
    } 
} 
+0

謝謝,它的工作原理。但我得到警告:在主線程上正在執行長時間運行的Parse操作。 中斷warnParseOperationOnMainThread()以進行調試。 – hodov

+0

@hodov我編輯了我的答案 – Milo

1

query.findObjectsInBackgroundWithBlock是將獲取對象之後執行同步,則完成塊被調用。因此塊後的代碼稱爲第一,因此numObjects值爲0

+0

那麼它的解決方案是什麼。我的意思是如果我們需要異步地處理這個過程。 – Unbreakable

2

這就是異步代碼的性質,你的函數將運行外部代碼完成,那麼一段時間後(取決於連接速度和查詢的複雜性)的C ompletion塊將運行。

調用代碼應該做類似如下:

  • 創建查詢
  • 開始與結束塊
  • 顯示加載動畫
  • 回報(查詢結果仍然未知)查詢

然後你應該考慮塊的內部:

  • 檢查錯誤的UI勢必
  • 更新值告訴UI刷新

你不能將返回計數功能,但你可以寫一個將完成塊作爲參數的函數,並在查詢完成塊中執行它。雖然這有點高級。