2016-05-29 17 views
-1

Ich versuche, den lokalen Player Score in pScore zu speichern, aber nach dem Block die Variable immer gleich 0, Wie kann ich den "localPlayerScore! .value" in pScore: Int speichern.Store Variable innerhalb Completion Handler 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

Sieht aus wie ein klassisches asynchrones Problem, das schon unzählige Male auf dieser Seite behandelt wurde. Es ist nicht so, dass Ihr 'pScore' nicht gesetzt wird, sondern dass' loadScoresWithCompletionHandler' die Anfrage im Hintergrund ausführt und daher sofort zurückkehrt. Daher wird Ihr Ausdruck vor dem Beendigungshandler aufgerufen. Verschieben Sie den Ausdruck in den Complete-Handler-Textkörper, um die abgerufene Punktzahl zum Drucken zu erhalten. – Hamish

Antwort

4

Meine Vermutung ist, Ihre Anfrage asynchron ist, was bedeutet, können Sie nicht wissen, wann es Ziel der Fall ist. Sie versuchen also, die Druckfunktion im Hauptthread aufzurufen, der vor der asynchronen Task aufgerufen wird. Versuchen Sie, in den Zeilen self.pScore = Int(localPlayerScore!.value) und print("Local player's score: \(pScore)") Breakpoints zu setzen. Du wirst verstehen, was ich meine. Wie auch immer, wenn Sie nur Ihre Daten in der asynchronen Aufgabe versuchen zu drucken, wird das Ergebnis zugreifen wie:

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

Dank i sortiert habe das Problem, wenn ich den Druck nach der fertigen nennen.

0

Ich habe etwas Code verspottet und möchte einige (möglicherweise Architektur/Stil) Fragen aufwerfen. Siehe den Code. Die folgende Lösung funktioniert in 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()