2016-02-10 8 views
0

После выполнения запроса из синтаксического разбора в разделе IF и хранится в StaffID. Я получил то, что хочу.Переменная становится нулевой после условия if-else

Но после, если/еще п переменная StaffID становится Nil

Вот код

func StaffIdQuery(DeviceToken: String) -> String 
{ 
    var StaffID = "" 
    let StaffIdQuery = PFQuery(className: "Staff") 
    StaffIdQuery.whereKey("StaffDeviceToken", equalTo: DeviceToken) 
    StaffIdQuery.getFirstObjectInBackgroundWithBlock { 
     (objects:PFObject?, error: NSError?) -> Void in 

     if error == nil && objects != nil { 
      StaffID = objects?.valueForKey("StaffID") as! String 
      print(StaffID) //This seems fine 
     } 
     else { 
    // Log details of the failure 
      print("Error: \(error!) \(error!.userInfo)") 
     } 
    } 
    print(StaffID) //this becomes nil 
    return StaffID 
} 

Что я должен исправить, чтобы получить данные запроса?

+0

Является ли ваша функция 'getFirstObjectInBackgroundWithBlock' async? –

+2

Ваш 'StaffIdQuery.getFirstObjectInBackgroundWithBlock' - это асинхронный вызов, который выполняет« позже », затем ваш' print (StaffID) ' – Breek

ответ

5

Это нуль или это пустая строка? Держу пари, что это последнее. В Свифта, когда вы объявляете вар, как вы делаете:

var StaffID = "" 

это предполагает тип быть String, не String?. Это означает, что он никогда не может быть никчемным.

Вы устанавливаете значение StaffID асинхронно, в фоновом режиме, но вы печатаете его до того, как эта фоновая очередь получит изменение, чтобы установить его. Если вы напечатаете его внутри блока (который вы уже сделали), вы получите правильное значение. Без дополнительной логики синхронизации вы никогда не должны полагаться на значение переменной, заданное в другом потоке/очереди.

+0

Спасибо! Теперь я понимаю, как работает getFirstObjectInBackgroundWithBlock. Но если я хочу получить данные запроса, какой метод я должен использовать вместо этого? –

+0

@NuttanichaSanpechvittaya рада, что я могу помочь! Я не уверен, что понимаю ваш второй вопрос. Вы имеете в виду, как запрашивать данные в Parse? – Macondo2Seattle

3

Ваш блок асинхронный. Случается, что когда вы вызываете getFirstObjectInBackgroundWithBlock, система отключается, чтобы получить эти данные в фоновом режиме, и ваш код продолжает выполняться. Вы печатаете «StaffID», прежде чем закончите получать данные. Затем, в более позднее время, блок выполняется, и ваш staffID заселяется.

Timeline:

  1. Send система от данных
  2. Печать данных (это еще не там) прибывает
  3. данных, после того, как вы вернулись нуль.

Вы можете использовать семафор ждать, пока блок не завершит - использовать что-то вроде топ ответа на этот вопрос: Wait for async task to finish completion block before returning in app delegate

Я думаю, что было бы лучше, подход, хотя смотреть на ваш дизайн и посмотреть, если вы не можете обрабатывать результаты в блоке, а не ждать его, и блокировать основной поток, ожидающий ввода-вывода.

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