2015-11-01 57 views
0

我的代碼如下所示,而我不明白的是爲什麼Void in之後的代碼永遠不會運行?我確實嘗試過調試,但似乎Block從未得到執行。findObjectsInBackgroundWithBlock沒有進入「Block」

順便說一下,查詢將返回空。

let query = PFQuery(className: "LastId") 
query.whereKey("UserId", equalTo: opUserIdList[i]) 
query.findObjectsInBackgroundWithBlock({ (objects, error) -> Void in 
    if let objects = objects { 
     for object in objects { 
      object.setValue(self.opLastIdChangedToList[i], forKey: "lastId") 
      object.saveInBackground() 
     } 
    } else { 
     let newLine = PFObject(className: "LastId") 
     newLine["lastId"] = self.opLastIdChangedToList[i] 
     newLine["userIdself."] = self.opUserIdList[i] 
     newLine.saveInBackground() 
    } 
}) 
//rest of the code 
+1

提供有關這是怎麼運行更多的情況下,它怎麼知道開始 – Wain

+0

當我調試運行查詢的代碼。 query.findObjectsInBackgroundWithBlock,然後跳轉到//代碼的其餘部分。 – ErkanA

+0

因爲它是異步?嘗試在該塊內部放置一個斷點,並等待您的應用進入該塊。 – Larme

回答

1

這是因爲Void in之後的代碼塊是閉包。簡單地說,它是一個指向包含稍後執行的代碼(代碼塊)的函數的指針,在完成調用它的父函數之後執行。

嘗試閱讀文檔,以更好地瞭解如何使用它:https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html#//apple_ref/doc/uid/TP40014097-CH11-ID94

+0

謝謝你的回答。現在我看到發生了什麼。順便說一句,隨着閉包在異步執行後,我得到錯誤數組索引超出範圍,因爲我(for for循環的索引)變得更大,謝謝數組的計數。是否有任何簡單的解決方案,或者我必須使用同步函數?(在這種情況下,findObjects) – ErkanA

+0

@ErkanA由於'閉包可以捕獲定義它的周圍環境中的常量和變量',所以'i '當你調用query.findObjectsInBackgroundWithBlock'時,當閉包被調用時不等於'i'索引。爲了解決這個問題,你可以在調用query.findObjectsInBackgroundWithBlock之前將當前的'i'值保存到某個常量'let currentIndex = i'中,並在其內部使用常數value:object.setValue(self.opLastIdChangedToList [currentIndex], forKey:「lastId」)' –