-1

ローカル プレーヤーのスコアを pScore に保存しようとしていますが、ブロックの後、変数は常に 0 になります。「localPlayerScore!.value」を pScore:Int に保存するにはどうすればよいですか。

    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)")
4

3 に答える 3

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)")
    }
}
于 2016-05-29T15:40:46.007 に答える
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()
于 2016-05-29T16:04:11.747 に答える