2015-12-23 90 views
0

我正在與Parse一起工作,我試圖存儲Parse爲您提供的對象唯一標識。以下是幫助理解這一點的代碼。無法關閉以關閉變量

var objectID = "" 
    var object = PFObject(className: "class") 
    object["columnTitle"] = "String Data" 
    object.saveInBackgroundWithBlock { (success, error) -> Void in 
     guard error == nil else { 
      print("Error") 
      return 
     } 

     objectID = object.objectId! 
    } 

    print(objectID) 

所以我想,當我跑的應用程序打印語句將打印出來的OBJECTID是Parse給你,但事實並非如此。如果我在閉包中添加print語句,它肯定會得到我期待的值。它看起來像print語句正在運行,纔可以更改該值。任何想法如何解決這個問題?我假設使用GCD

所有這一切都是內部viewDidLoad()

+0

結束時,我相信你會得到新的對象ID,當你從parse – Lamar

+1

這就是查詢對象返回因爲'saveInBackgroundWithBlock'正在另一個線程中運行,當進程完成並且您正在'Main thread'中執行'print(objectID)'時'' –

+0

謝謝!我怎麼能(不知道我是否正確地問)將封閉中更改的objectID信息移動到主線程,以便更新變量? –

回答

1

saveInBackgroundWithBlock是一個異步調用。如果您在該塊中打印了對象ID,則會在該塊在另一個線程中執行時進行打印。

如果您將print放置在塊的外面,那麼將在saveInBackgroundWithBlock的調用之後立即執行下一個語句。你應該在這兩個陳述中放置斷點並理解行爲。

你可以定義包含對象ID相關的處理代碼的方法,並調用該方法在您saveInBackgroundWithBlock

+0

我是否通過GCD來做到這一點?如果是這樣,我該怎麼做? –