如何知道发送的数据是什么类型?

How to know what type is the data sent?

我有这个功能,我可以检索在某些功能期间发送的一些数据:

@available(iOS 9.0, *)
func match(_ match: GKMatch, didReceive data: Data, forRecipient recipient: GKPlayer, fromRemotePlayer player: GKPlayer) {
    print("RECEIVED DATA 9.0")
        receiveData(turnLog: data, player: player)
        receiveDataAction(movment: data, player: player)
        receiveDataActionTop(movmentTop: data, player: player)
}

但显然我调用的每个函数都与特定数据相关。我如何知道我接收到的数据的 "type" 来创建 if-else 语句?

我这样发送数据:

let encoder = JSONEncoder()
let dataMovment = try! encoder.encode(SKActionDescriptor(x: 450, duration: 0.25, x2: 1050, duration2: 0.5))
try match?.sendData(toAllPlayers: dataMovment, with: GKMatchSendDataMode.reliable)

这完全取决于您发送的数据类型。由您来设置一个系统,让接收方可以弄清楚它正在处理的数据。

一般有2种方式。

  1. 模式(数据的 "layout")作为数据的一部分进行通信。例如JSON,其中 [ ]/{ } 传达字段的结构。当你得到一大块 JSON 时,你不知道数组中的第一个对象持续了多长时间。它从 { 开始,一直持续到匹配的 }。 JSON 本身编码其自身布局的描述。

  2. 架构是协议定义的,不会传输。正确实现该协议的接收器将期望进入它的数据与协议中定义的约束相匹配。例如,一个 UDP 数据包,它只是 "raw" 数据,其模式不会被传输,而是由协议定义:

    • 前2个字节编码源端口
    • 后2个字节编码目的端口
    • 接下来的 2 个字节编码负载大小
    • 接下来的 2 个字节编码数据包的校验和
    • 接下来的n个字节构成有效载荷。

    None这个结构信息是数据包自描述的。相反,它是由 UDP 协议定义的,任何 sender/receiver "plays nice" 都应遵循该架构。