Я пытаюсь сохранить счет локального игрока в 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)")
-1
uk_rules_ok 29 Май 2016 в 18:23

3 ответа

Лучший ответ

Я предполагаю, что ваш запрос асинхронный, что означает, что вы не можете знать, когда он закончится. Итак, вы пытаетесь вызвать функцию печати в основном потоке, который вызывается перед асинхронной задачей. Попробуйте поставить точки останова в строках 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)")
    }
}
4
ridvankucuk 29 Май 2016 в 15:40

Я издевался над некоторым кодом и хотел бы поднять некоторые вопросы (возможно, по архитектуре / стилю). Смотрите код. Приведенное ниже решение работает в 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()
0
Yevhen Dubinin 29 Май 2016 в 16:04

Спасибо, я решил проблему, если вызову печать после ее завершения.

 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
uk_rules_ok 29 Май 2016 в 15:56