2015-12-23 5 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 работает до того, как значение можно изменить. Любая идея, как это исправить? Я предполагаю использовать GCD?

Все это находится внутри viewDidLoad()

+0

Я считаю, что вы получите новый идентификатор объекта, когда вы запрашиваете объект назад от синтаксического анализа – Lamar

+1

Thats потому что 'saveInBackgroundWithBlock' работает в другом потоке, который вызывается, когда процесс завершен, и вы выполняете' print (objectID) 'в' Main thread' –

+0

Спасибо! Как я могу (не уверен, правильно ли я это задаю) переместить информацию об объекте, которая была изменена в закрытии основного потока, чтобы переменная обновлялась? –

ответ

1

saveInBackgroundWithBlock асинхронный вызов. Если вы печатаете идентификатор объекта в блоке, он печатается, когда блок выполняется в другом потоке.

Если вы разместите print вне блока, это будет следующий следующий оператор, выполненный после вызова saveInBackgroundWithBlock. Вы должны помещать точки останова в эти два утверждения и понимать поведение.

Вы можете определить метод, содержащий связанный объект ID код обработки и вызвать этот метод в конце вашего saveInBackgroundWithBlock

+0

Я делаю это, хотя GCD? Если да, то как мне это сделать? –

Смежные вопросы