2015-05-29 3 views
0

Массив, возвращающий пустой массив, когда находится вне PFQuery. По какой-то причине элементы не передаются массиву при компиляции.Массив, перенастраивающий пустой массив вне PFQuery с Parse.

class DriverViewController: UIViewController { 
var placesArr : Array<Place> = [] 


    override func viewDidLoad() { 
    super.viewDidLoad() 
    self.window = UIWindow(frame: UIScreen.mainScreen().bounds) 


    var query = PFQuery(className:"places") 
    query.whereKey("username", equalTo:"[email protected]") 
    query.findObjectsInBackgroundWithBlock { 
     (objects: [AnyObject]?, error: NSError?) -> Void in 

     if error == nil { 
      println("Successfully retrieved \(objects!.count) scores.") 

      if let objects = objects as? [PFObject] { 
       for object in objects { 
      let x = Place(aIdent: (object["Ident"] as! Int), aName: (object["name"] as! String), aAddress: (object["originAddress"] as! String), aCity: (object["originCity"] as! String), aCategoryName: (object["catName"] as! String), aLat: (object["aLat"] as! String), aLng: (object["aLng"] as! String)) 

        self.placesArr.append(x) 
        println(placesArr) //****It works here and prints an array**** 
       } 
      } 
     } else { 
      // Log details of the failure 
      println("Error: \(error!) \(error!.userInfo!)") 
     } 
    } 
println(placesArr) //****But here it returns a blank array and this is where I need it to return an array**** 

ответ

4

Это очень распространенное заблуждение, относящееся к резьбе, вопрос, какие события порядка запуска:

// Runs 1st 
query.findObjectsInBackgroundWithBlock { 
    (objects: [AnyObject]?, error: NSError?) -> Void in 
    // Runs 3rd 
} 
// Runs 2nd 
println(placesArr) 

Выполнение программы не останавливается, когда вы звоните findObjectsInBackground, он находит объекты: inBackground что означает тяжелый подъем сетевого запроса отправляется в другую очередь, так что пользователь все еще может взаимодействовать с экраном. Простой способ сделать это будет делать:

var placesArray: [Place] = [] { 
    didSet { 
     // Do any execution that needs to wait for places array here. 
    } 
} 

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

+0

Спасибо Логан! Размещение важно. Для этого, var placesArray: [Place] = [] { didSet { // Выполняем любое выполнение, которое должно ждать массив мест здесь. } } Необходимо идти перед PFQuery. –

1

query.findObjectsInBackgroundWithBlock является операцией блок, который выполняет в фоновом режиме - это асинхронный.

Линия println(placesArr) фактически выполняется до завершения блока - вот почему вы видите nil.

2

Ответ Логана прямо в деньгах.

Смотрите мой ответ в этой теме: Storing values in completionHandlers - Swift

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

+0

Я чувствую, что я делаю один из них в день, например, этот вчера http://stackoverflow.com/questions/30493949/unable-to-use-the-result-of-a-parsequery/30495060#30495060. Я думал, что вы написали общий вопрос и ответ на этот вопрос, но не смогли найти его в качестве ссылки. – danh

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

  • Нет связанных вопросов^_^