2016-05-29 9 views
-1

ローカルプレーヤーのスコアをpScoreに保存しようとしていますが、ブロックの後に変数が常に0に等しい場合、どうすればpScore:Intに "localPlayerScore!Completionハンドラ内に変数を格納するIOS Swift

let leaderBoardRequest = GKLeaderboard() 
    leaderBoardRequest.identifier = "leaderboard ID" 

    leaderBoardRequest.loadScoresWithCompletionHandler { 
     (scores, error) -> Void in 
     if (error != nil) { 
      print("Error: \(error!.localizedDescription)") 
     } else if (scores != nil) { 
      let localPlayerScore = leaderBoardRequest.localPlayerScore 
      self.pScore = Int(localPlayerScore!.value) 
     } 
    } 

    print("Local player's score: \(pScore)") 
+6

以前このサイトで無数の時​​間をカバーしていた古典的な非同期問題のように見えます。あなたの 'pScore'が設定されていないということではなく、' loadScoresWithCompletionHandler'がバックグラウンドでリクエストを行い、したがってすぐに戻ります。したがって、あなたのプリントは完了ハンドラの前に呼び出されます。印刷物を完成ハンドラ本体に移動して、検索した得点を印刷します。 – Hamish

答えて

4

あなたのリクエストは非同期であるため、完了したタイミングを知ることはできません。したがって、非同期タスクの前に呼び出されるメインスレッドでprint関数を呼び出そうとしています。ブレークポイントをself.pScore = Int(localPlayerScore!.value)print("Local player's score: \(pScore)")行に入れてください。私は何を意味するのか理解しています。あなただけの非同期タスク内のデータを印刷しようとにかく場合は、次のような結果にアクセスします:

let leaderBoardRequest = GKLeaderboard() 
leaderBoardRequest.identifier = "leaderboard ID" 

leaderBoardRequest.loadScoresWithCompletionHandler { 
    (scores, error) -> Void in 
    if (error != nil) { 
     print("Error: \(error!.localizedDescription)") 
    } else if (scores != nil) { 
     let localPlayerScore = leaderBoardRequest.localPlayerScore 
     self.pScore = Int(localPlayerScore!.value) 
     print("Local player's score: \(self.pScore)") 
    } 
} 
0

おかげで、私はその完成後に印刷を呼び出す場合、私は、問題をソートしています。

let leaderBoardRequest = GKLeaderboard() 
leaderBoardRequest.identifier = "leaderboard ID" 

leaderBoardRequest.loadScoresWithCompletionHandler { 
    (scores, error) -> Void in 
    if (error != nil) { 
     print("Error: \(error!.localizedDescription)") 
    } else if (scores != nil) { 
     let localPlayerScore = leaderBoardRequest.localPlayerScore 
     self.pScore = Int(localPlayerScore!.value) 
    } 
    self.cont() 
} 

func cont() { 
    print("Local player's score: \(pScore)") 
} 
0

私はいくつかのコードを嘲笑し、いくつかの(おそらくアーキテクチャ/スタイルの)質問を挙げたいと思います。コードを参照してください。以下の解決策は、Playgroundで機能します。

import Foundation.NSError 

typealias GKLeaderboardCompletion = (Int?,NSError?)->(Void) 

class GKLeaderboard { 
    var identifier: String = "" 
    var localPlayerScore: Int? 
    func loadScoresWithCompletionHandler(completion: GKLeaderboardCompletion) { 
     sleep(2) 
     localPlayerScore = 10 
     completion(localPlayerScore, nil) 
    } 
} 

class GKSomeClass { 

    var pScore: Int? = nil 

    func someFunc() { 
     let leaderBoardRequest = GKLeaderboard() 
     leaderBoardRequest.identifier = "leaderboard ID" 

     // in order to be safe here, better to put "[unowned self]" (read more) 
     leaderBoardRequest.loadScoresWithCompletionHandler { [unowned self] 
      (scores, error) -> Void in 
      if (error != nil) { 
       print("Error: \(error!.localizedDescription)") 
      } else if (scores != nil) { 

       // #1: Why don't you utilize the "scores"? 

       // #2: Does "leaderBoardRequest.localPlayerScore == scores" at the time of the callback? 

       // #3: What's the type of "leaderBoardRequest.localPlayerScore" here below? 
//    self.pScore = Int(localPlayerScore!.value) 

       let localPlayerScore = leaderBoardRequest.localPlayerScore 
       self.pScore = localPlayerScore 

       print("Local player's score: \(self.pScore)") 
      } 
     } 
    } 
} 

let someClass = GKSomeClass() 
someClass.someFunc() 
関連する問題