2015-01-18 4 views
0

내 GameCenterHelper 클래스에 다음 코드를 다룰 수있었습니다. 그러나 나는 스위프트의 블록과 완성 된 핸 들러들과 완전히 잃어 버렸다. 누군가가 비동기적인 completionHandler에 의해 제공된 데이터에 접근하는 코드 예제를 도착한 순간에 게시 할 수 있습니까?비동기 호출에서 제공 한 데이터를 Swift에서 UI에 표시하는 방법은 무엇입니까?

class ShowHighscoresScene: SKScene { 

override init(size: CGSize) { 
    super.init(size: size) 
    gameCenter.getHighscores() 
    //what kind of parallel-thread-completionHandler-thingy goes here so I can show the highscores when the arrive, if the player is still using this scene? 
} 
... 
} 

class GameCenterHelper { 
... 
func getHighscores() { 
    leaderboardReceived = nil 
    let leaderboardRequest = GKLeaderboard() as GKLeaderboard! 
    leaderboardRequest.identifier = "appId" 
    if leaderboardRequest != nil 
    { 
     leaderboardRequest.loadScoresWithCompletionHandler({ (scores:[AnyObject]!, error:NSError!) -> Void in 
      if (error != nil) 
      { 
       println("error in leaderboard highscore request") 
       println(error.description) 
      } 
      else 
      { 
       self.leaderboardReceived = leaderboardRequest 
      } 

     }) 
    } 
} 
... 

답변

1

당신은 loadScoresWithCompletionHandler의 완성 블록에 넣어 것 :

leaderboardRequest.loadScoresWithCompletionHandler({ (scores:[AnyObject]!, error:NSError!) -> Void in 
     if (error != nil) 
     { 
      println("error in leaderboard highscore request") 
      println(error.description) 
     } 
     else 
     { 
      self.leaderboardReceived = leaderboardRequest 

      // Your data-presenting code goes here: 
      self.tableView.reloadData() 
     } 

    }) 
+0

는 메인 스레드에 그 파견해야합니다. getHighScores를 변경하여 클로저 자체를 취하는 것이 더 나을 수도 있습니다. – Rob