2016-11-18 2 views
3

Ich versuche, die folgende Struktur von einem Spieler zu einem anderen zu senden:Game Center - Senden und Empfangen von Daten mit Swift

struct GamePacket { 
    var action: String 
    var pointArray: [CGPoint] 
} 

Ich bin eine harte Zeit, die richtige Art und Weise herauszufinden, die GamePacket zu konvertieren Data und wieder zurück.

Hier ist der Code ich für Senden Pakete bisher haben:

func send(packet: GamePacket) { 
    //convert GamePacket to Data here 
    let data = Data.init() 

    var remotePlayerArray = [GKPlayer]() 

    if let currentPlayer = self.currentPlayer, let match = self.match, let playerArray = self.match?.players { 
     for player in playerArray { 
      if player != currentPlayer { 
       remotePlayerArray.append(player) 
      } 
     } 

     do { 
      try match.send(data, to: remotePlayerArray, dataMode: GKMatchSendDataMode.reliable) 
     } 
     catch { 
      print("connectionError") 
     } 
    } 
} 

Und der Code für Empfang:

func match(_ match: GKMatch, didReceive data: Data, fromRemotePlayer player: GKPlayer) { 
    //convert Data to GamePacket here 
} 

Von einigen Proben in ObjectiveC geschrieben, habe ich es geschafft wandeln Sie das GamePacket zu Data um, indem Sie etwas verwenden, das dem folgenden ähnlich ist:

let data = NSData(bytes: &packet, length: MemoryLayout<GamePacket>.size) as Data 

aber ich kann nicht herausfinden, wie die Data wieder auf dem empfangenden Ende zu einem GamePacket zu konvertieren, noch bin ich sicher, dass dies der richtige Weg, es zu tun.

Jede Hilfe wird sehr geschätzt. Vielen Dank.

Antwort

2

wäre eine schnelle und schmutzige Lösung so etwas wie diese:

func encodeGamePacket(packet: GamePacket) -> NSData { 
    return NSData(bytes: &gamePacket, length: MemoryLayout<GamePacket>.size) 
} 

func decodeGamePacket(data: NSData) -> GamePacket? { 
    var tempBuffer:GamePacket? = nil 
    data.getBytes(&tempBuffer, length: MemoryLayout<GamePacket>.size) 
    return tempBuffer 
} 

ich mit direkten Adressen mich noch nicht unter swift messed habe, so dass ich bin mir nicht ganz sicher, ob dies der beste Ansatz ist. Beachten Sie, dass ich einen optionalen Rückgabetyp verwendet habe. Sie können dies in Ihrem Code anders gestalten (z. B. einige Überprüfungen hinzufügen, die Variable auspacken und zurückgeben oder eine Ausnahme auslösen, wenn die Überprüfungen fehlschlagen).

Alternativ könnten Sie eine Methode entwickeln, die Ihre GamePacket in eine String (zur besseren Lesbarkeit, zum Beispiel) schreibt, die Sie wiederum in NSData verwandeln kann (String hat eine data-Methode) oder Sie wenden GamePacket in eine NSCoding konforme Klasse, bietet auch Methoden an, um sich in NSData umzuwandeln.