ios - 检查已通过 GKMatchDelegate didReceiveData 接收到整个结构

标签 ios swift struct gamekit

我正在使用 GameKit 开发多人 Swift (XCode 7.3/iOS 9.2) 游戏。

我使用自定义结构作为通过 GameKit 发送的信息。该结构的副本如下。 frustnessNetworkMessage 是一个 String 枚举 & Card 是一个单独的类(如果需要可以发布代码)

struct frustrationNetworkMessage {
var messageType : FrustrationNetworkMessageType
var cards : [Card]
var actingPlayer : String

init(messageType : FrustrationNetworkMessageType, cards : [Card], actingPlayer : String) {
    self.messageType = messageType
    self.cards = cards
    self.actingPlayer = actingPlayer
}

我的问题出在 'match(match: GKMatch, didReceiveData data: NSData, fromRemotePlayer player: GKPlayer)' 方法中。我已经知道一旦收到一些数据就会调用它:

private var receivedData : NSMutableData

func decode<T>(data: NSData) -> T {
    let pointer = UnsafeMutablePointer<T>.alloc(sizeof(T.Type))
    data.getBytes(pointer, length: sizeof(T))
    return pointer.move()
}

func match(match: GKMatch, didReceiveData data: NSData, fromRemotePlayer player: GKPlayer) {
    print("Match / did receive data: size of data - \(sizeofValue(data))")
    receivedData.appendData(data)
    if let receivedNetworkMessage : frustrationNetworkMessage = decode(receivedData) {
        print("Match / did receive data: \(receivedNetworkMessage.messageDetails())")

当我运行上面的代码时,它在带有 EXC_BAD_ACCESS 的最终打印语句处崩溃(我的理解是它提示它正在尝试访问尚未收到的结构部分)。

举个例子:

已发送消息摘要 -> sendNetworkMessage:消息类型:startNewGame with actingPlayer:G:118279601 & 卡数:1 - 消息大小:40

消息长度第一次匹配 didReceiveData 被调用 -> 匹配/接收数据:数据大小 - 8

如何在对结构进行操作之前检查是否已获取整个结构?我曾想过更新结构以包含一个长度字段(理论上我应该总是一次性收到它 - 所以可以用它来检查数据包长度)。

最佳答案

您可以使用这样的后台进程来持续检查您的数据结构吗?

newQueue = NSOperationQueue()

let operation2 = NSBlockOperation(block: {


    })

operation2.completionBlock = {
    print("Operation 2 completed")
}

let operation1 = NSBlockOperation(block: {


    })

operation1.completionBlock = {

    self.newQueue.addOperation(operation2)
}

operation1.qualityOfService  = .UserInitiated
newQueue.addOperation(operation1)
}

初始化变量,然后检查它们的长度;这将保存/阻止它崩溃。

关于ios - 检查已通过 GKMatchDelegate didReceiveData 接收到整个结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36346952/

相关文章:

ios - 将属性应用于 iOS 中的文本

ios - UITextField 没有得到键盘输入

ios - SSL 握手仅在 IOS 上失败

ios - 使用 swift 和 flutter 集成 Stripe SDK

c - 传递结构时不兼容的类型

c - 编写一个函数来计算 c 结构中的元素数量

objective-c - 你可以继承 objc 中编译时不可用的类吗?

ios - 如何让 View 跟随我的手指移动?方向是从左到右

ios - 快速获取 nsdictionary 的所有键按字母顺序排序?

c++ - 尝试访问数组时数据从数组中丢失