2016-11-18 4 views
3

내가 다른 하나의 플레이어에서 다음과 같은 구조를 보내려고하고 데이터를 전송 및 수신 :게임 센터 - 스위프트

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

내가 할 수있는 GamePacket을 변환 할 수있는 올바른 방법을 알아내는 힘든 시간을 보내고 있습니다을 Data 그리고 다시.

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") 
     } 
    } 
} 

그리고 의 코드가를 수신 : 여기

내가 패킷 전송을 위해 지금까지 가지고있는 코드 ObjectiveC에 기록 된 몇 가지 샘플에서

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

을, 나는에 관리 다음과 비슷한 것을 사용하여 GamePacketData으로 변환하십시오.

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

그러나, 나는 수신 측에 GamePacket로 다시 Data 변환도 확실이 그것을 할 올바른 방법이 생각하는 방법을 알아낼 수 없습니다.

모든 도움이 크게 감사드립니다. 고맙습니다.

답변

2

신속하고 더러운 솔루션은 다음과 같이 될 것이다 :

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 
} 

나는 아직 신속한에서 직접 주소로 자신을 엉망하지 않은, 그래서 나는 이것이 가장 좋은 방법인지 전혀 모르겠습니다. 선택적 반환 유형을 사용했음을 참고하십시오. 코드에서 다르게 디자인 할 수 있습니다 (수표를 추가하고 변수의 포장을 풀어 반환하거나 수표가 실패 할 때 예외를 throw합니다).

또는 당신은 당신이 차례로 (문자열이 data 방법이있다) NSData로 변환 할 수있는 (예를 들어, 읽기 쉽)을 StringGamePacket를 기록하는 방법을 설계 할 수 또는 당신은 NSCoding 준수 클래스로 GamePacket를 설정하는 것이 자신을 NSData으로 변환하는 방법도 제공합니다.