Проблема быстрого определения области видимости

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

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() в операторе while возвращает

[[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, он возвращает [][]

Любая помощь приветствуется.


person Jim McDermott    schedule 21.11.2014    source источник
comment
Что вы имеете в виду внутри viewDidLoad statement?   -  person matt    schedule 21.11.2014
comment
println() в инструкции while я не вижу println() всего.   -  person matt    schedule 21.11.2014
comment
Я имею в виду размещение его за пределами всего оператора синтаксического анализа и прямо перед закрывающей скобкой в ​​​​операторе viewDidLoad.   -  person Jim McDermott    schedule 21.11.2014
comment
Покажите это в своем коде. Никто не может догадаться, что вы делаете. Никто не должен. Покажите, что вы делаете.   -  person matt    schedule 21.11.2014
comment
Покажите, что вы печатаете и где вы это печатаете. Покажите свой реальный код.   -  person matt    schedule 21.11.2014
comment
Прямо сейчас он находится там как navigationItem.title = (players), что просто помогает мне его показать. Он находится в конце оператора viewDidLoad.   -  person Jim McDermott    schedule 21.11.2014
comment
Хорошо, я понял, спасибо. Напишу ответ!   -  person matt    schedule 21.11.2014


Ответы (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.

person matt    schedule 21.11.2014
comment
Попался. Итак, как мне применить это к моему текущему коду? - person Jim McDermott; 21.11.2014
comment
Это это ваш текущий код. Вы пытаетесь получить self.players до того, как ему было присвоено значение. Это не сработает! - person matt; 21.11.2014
comment
Ах я вижу. Итак, просто чтобы уточнить, чтобы исправить это, что мне нужно сделать, чтобы убедиться, что он не извлекается до того, как ему будет присвоено значение? - person Jim McDermott; 21.11.2014
comment
Если вы находитесь в viewDidLoad, единственное место, где ему было присвоено значение, — это после цикла while, но внутри фонового блока. - person matt; 21.11.2014
comment
Если вы находитесь за пределами viewDidLoad, то если метод вызывается позже, self.players может быть установлен, а может и нет. :) Это то, что вы получаете за выполнение фонового запроса. Вы не знаете, когда это закончится. - person matt; 21.11.2014
comment
Ага, теперь вижу. Итак, как мне сделать так, чтобы значения в этом массиве были доступны за пределами фонового блока (т.е. в функциях просмотра таблиц)? Еще раз спасибо за всю вашу помощь до этого момента - person Jim McDermott; 21.11.2014
comment
Вот в чем дело. Значения будут со временем доступны. Таким образом, вы пишете свои табличные функции для работы независимо от того, есть ли значения; если еще ничего нет, просто создайте таблицу с нулевой строкой. - person matt; 21.11.2014
comment
Затем внутри фонового блока, но после цикла while, вы переходите к основному потоку и вызываете reloadData таблицы, так что табличные функции вызываются снова. На этот раз есть данные! - person matt; 21.11.2014
comment
Вам может быть полезно прочитать главу в моей книге о потоках: apeth.com/iOSBook/ch38. html - person matt; 21.11.2014
comment
Это сработало!!!! Большое вам спасибо... вы не представляете, как сильно вы помогли мне не только с реальной проблемой, но и с пониманием асинхронных методов. Благодаря тонну. - person Jim McDermott; 21.11.2014
comment
Это понимание, что меня больше всего беспокоит! :) Это очень важная концепция, поэтому, если вы ее усвоили, вы сделали большой шаг вперед. - person matt; 21.11.2014
comment
Конечно... Это определенно дает мне лучшее представление о будущем. - person Jim McDermott; 21.11.2014