Я пытаюсь сохранить счет локального игрока в 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)")
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)")
}
}
Я издевался над некоторым кодом и хотел бы поднять некоторые вопросы (возможно, по архитектуре / стилю). Смотрите код. Приведенное ниже решение работает в 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()
Спасибо, я решил проблему, если вызову печать после ее завершения.
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)")
}
Похожие вопросы
Новые вопросы
ios
iOS - мобильная операционная система, работающая на Apple iPhone, iPod touch и iPad. Используйте этот тег [ios] для вопросов, связанных с программированием на платформе iOS. Используйте связанные теги [target-c] и [swift] для проблем, характерных для этих языков программирования.