2016-05-29 2 views
-1

Я пытаюсь сохранить счет локального игрока в pScore, но после блока переменная всегда равна 0, Как я могу сохранить «localPlayerScore! .value» в pScore: Int.Хранить переменную внутри обработчика завершения 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

Я предполагаю, что ваш запрос асинхронный, что означает, что вы не можете знать, когда он закончит. Таким образом, вы пытаетесь вызвать функцию печати в основном потоке, который вызывается перед асинхронной задачей. Попробуйте поставить точки останова в 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() 
Смежные вопросы