2014-11-21 3 views
0

У меня есть приложение, которое извлекает информацию из базы данных parse.com и передает ее в массив. Когда I println() этот массив изнутри цикла while, он печатает отлично. Когда я пытаюсь распечатать его за пределами цикла while, он возвращается пустым. Вот мой код:Swift scoping issue

var players = [String]() 
var total = [String]() 

var addTotal:AnyObject! 
var addTotalFinal:Int! 

var addPlayers:AnyObject! 
var addPlayersFinal:Array<Int>! 

@IBOutlet weak var tableView: UITableView! 
var test: AnyObject! 
override func viewDidLoad() { 
    super.viewDidLoad() 

    Parse.setApplicationId("KZ758LUTQZQ9Kl69mBDkv7BNLGHyXeKmqtFf7GmO", clientKey: "lOK5rg7wKeTRXZGV7MZBlQ5PTpNlGO0mkgtLkLgH") 

    var query = PFQuery(className:"runningTotal") 
    query.whereKey("total", notEqualTo: 0) 
    query.findObjectsInBackgroundWithBlock 
    { 
     (objects: [AnyObject]!, error: NSError!) -> Void in 
     if error == nil 
     { 

      var i = 0 

      while i < objects.count 
      { 

      self.addTotal = objects[i]["total"] 
      self.addTotalFinal = self.addTotal as Int 

      self.addPlayers = objects[i]["players"] 
      self.addPlayersFinal = self.addPlayers as Array 

      self.players.append("\(self.addPlayersFinal)") 
      self.total.append("\(self.addTotalFinal)") 

       ++i 
      } 



     } 
     else 
     { 

     } 




    } 

    navigationItem.title = "\(players)" 



} 


func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
{ 
    return players.count 
} 


func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
{ 
    var cell = tableView.dequeueReusableCellWithIdentifier("MyCell", forIndexPath: indexPath) as UITableViewCell 
    cell.textLabel.text = "\(players[indexPath.row]) - \(total[indexPath.row])" 

    return cell 

} 

Println() в заявлении в то время как возвращает

[[1, 11, 12, 24, 25]] 
[2] 

[[1, 11, 12, 24, 25], [1, 5, 24, 25, 31]] 
[2, 4] 

[[1, 11, 12, 24, 25], [1, 5, 24, 25, 31], [2, 12, 25, 15, 31]] 
[2, 4, -1] 

[[1, 11, 12, 24, 25], [1, 5, 24, 25, 31], [2, 12, 25, 15, 31], [24, 22, 25, 31, 20]] 
[2, 4, -1, -6] 

[[1, 11, 12, 24, 25], [1, 5, 24, 25, 31], [2, 12, 25, 15, 31], [24, 22, 25, 31, 20], [1, 2, 3, 4, 5]] 
[2, 4, -1, -6, 5] 

[[1, 11, 12, 24, 25], [1, 5, 24, 25, 31], [2, 12, 25, 15, 31], [24, 22, 25, 31, 20], [1, 2, 3, 4, 5], [1, 10, 11, 2, 12]] 
[2, 4, -1, -6, 5, 1] 

Это имеет смысл, так как есть шесть итераций. Однако, если я печатаю внутри оператора viewDidLoad вместо внутреннего оператора while, он возвращает [] []

Любая помощь с благодарностью.

+0

Что вы имеете в виду «внутри выражения' viewDidLoad'? – matt

+0

«println() в выражении while« Я не вижу 'println()' _anyhwere_. – matt

+0

Я имею в виду, что он помещается вне всей инструкции синтаксического анализа и просто справа перед закрывающей скобкой в ​​предложении viewDidLoad –

ответ

1

Проблема в том, что вы не поняли, как работает нить/асинхронное выполнение. Давайте попробуем. Это псевдокод:

func viewDidLoad { 
    doStepOne() // you configure your query here 
    doStepTwoWithAsynchBlock { 
     doStepTwo() // your while loop is here 
    } 
    doStepThree() // your failing println is here 
} 

Это выполняется в порядке doStepOne(), doStepThree(), doStepTwo(). Поэтому, если doStepThree() пытается получить значение, которое doStepTwo() комплектов, оно еще не готово.

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

+0

Gotch а. Итак, как бы применить это к моему текущему коду? –

+0

Это _is_ ваш текущий код. Вы пытаетесь получить «self.players», прежде чем ему будет присвоено значение. Это не сработает! – matt

+0

А, я вижу. Поэтому просто для уточнения, чтобы исправить это, что мне нужно сделать, чтобы убедиться, что он не извлекается до того, как ему дали значение? –