游戏中心 - 使用Swift发送和接收数据

时间:2016-11-18 09:24:12

标签: ios swift swift3 ios10 game-center

我正在尝试将以下结构从一个玩家发送到另一个玩家:

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") } } } 转换为func match(_ match: GKMatch, didReceive data: Data, fromRemotePlayer player: GKPlayer) { //convert Data to GamePacket here } 然后再转回的正确方法。

以下是发送数据包到目前为止的代码:

ObjectiveC

接收的代码:

GamePacket

Data中编写的一些示例中,我设法将let data = NSData(bytes: &packet, length: MemoryLayout<GamePacket>.size) as Data 转换为Data,使用的内容类似于以下内容:

GamePacket

但是,我无法弄清楚如何将this转换回接收端的var select = $("#selectElement"); select.val(select.children(":first").val()); ,我也不确定这是否是正确的方法。

任何帮助都非常有用。谢谢。

2 个答案:

答案 0 :(得分:3)

使用Codable

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

然后,您可以轻松转换为Data

func save<T: Encodable>(_ item: T, to url: URL) throws -> Data {
  let encoder = JSONEncoder()
  return try encoder.encode(item)
}
func load<T: Decodable>(from data:Data) throws -> T {
  let decoder = JSONDecoder()
  let item = try decoder.decode(T.self, from: data)
  return item
}

答案 1 :(得分: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
}

我还没有迅速搞砸直接地址,所以我不完全确定这是否是最佳方法。请注意,我使用了一个可选的返回类型,你可以在代码中设计不同的东西(可能添加一些检查,解包变量并返回它或在检查失败时抛出异常)。

或者,您可以设计一种方法,将GamePacket写入String(例如,为了便于阅读),然后您可以将其转换为NSData(字符串有{{} 1}}方法)或者您将data转换为GamePacket兼容类,该类提供将自身转换为NSCoding的方法。