2014-11-21 2 views
0

parse.com 데이터베이스에서 정보를 가져 와서 배열로 전달하는 앱이 있습니다. while 루프 내부에서이 배열을 println()하면 잘 인쇄됩니다. 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] 

이 말이 반환 : 여기 내 코드입니다. 그러나 while 문 대신 viewDidLoad 문을 인쇄하면 [] [] [] []

모든 도움을 주셔서 감사합니다.

+0

"viewDidLoad 문"내에서 무엇을 의미합니까? – matt

+0

"while 문에서 println()은"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

고트 에이. 그렇다면이 코드를 현재 코드에 어떻게 적용할까요? –

+0

현재 _is_ 현재 코드입니다. 값을 받기 전에'self.players'를 꺼내려고합니다. 그게 효과가 없을거야! – matt

+0

아, 알겠습니다. 그래서 명확히하기 위해, 가치를 부여 받기 전에 내가 가져온 것이 아닌지 확인하기 위해 무엇을해야 하는지를 고쳐야합니까? –