【问题标题】:Data sent through NSData is only partially received通过 NSData 发送的数据仅被部分接收
【发布时间】:2016-06-30 03:21:51
【问题描述】:

尝试使用 GameKit 和 GKMatch 编写一个小型实时纸牌游戏。 我关注了this Game Center tutorial(在 Objective-C 中),但现在一直试图将其转换为 Swift 2。

我的枚举和结构:

enum Messagetype:Int {
        case kMessageTypeRandomNumber = 0
        case kMessageTypeGameBegin = 1
        case kMessageTypeMove = 2
        case kMessageTypeGameOver = 3
    }

struct Message {
    var messageType:Messagetype = .kMessageTypeMove
}

struct MessageRandomNumber {
    var message = Message()
    var randomNumber: Int = -1
}

var ourRandomNumber:Int = Int(arc4random_uniform(100000))+1

有趣的 sendRandomNumber()

func sendRandomNumber() {
        var message = MessageRandomNumber()

        message.randomNumber = self.ourRandomNumber
        message.message.messageType = .kMessageTypeRandomNumber

        let data = NSData(bytes: &message, length: sizeof(MessageRandomNumber))
        self.sendData(data)
        print ("Random number \(message.randomNumber) sent from \(localPlayer.alias!)")
}

函数发送数据

func sendData(data: NSData) {

        let gameKitHelper = GameKitHelper.sharedGameKitHelper
        var succes:Bool? = true

        do {
            try gameKitHelper.match.sendDataToAllPlayers(data, withDataMode: .Reliable)
            } catch {
                succes = nil
            }
            if succes == nil {
                print ("Error sending data.")
        }
}

func match.didReceiveData

func match(match: GKMatch, didReceiveData data: NSData, fromRemotePlayer player: GKPlayer) {
        print ("Data received.")
        let message:Message = UnsafePointer<Message>(data.bytes).memory as Message

        if (message.messageType == .kMessageTypeRandomNumber) {
            let messageRandomNumber:MessageRandomNumber = UnsafePointer<MessageRandomNumber>(data.bytes).memory as MessageRandomNumber

            print ("Received random number \(messageRandomNumber.randomNumber)")
}

我可以在日志中看到随机数 0 被选择并使用来自设备的 sendRandomNumber 发送。

通过 didReceiveData 我看到了:

  1. message.messageType = .kMessageTypeRandomNumber(与初始化结构的值不同。另外,这个值是在 sendRandomNumber 中设置的,所以我相信这部分会正确发送)。
  2. messageRandomNumber.message.messageType = .kMessageTypeRandomNumber(再次正确)
  3. 但是,messageRandomNumber.randomNumber 始终为 0(这是不正确的)

我在这里遗漏了什么明显的东西吗?

【问题讨论】:

    标签: swift nsdata gamekit


    【解决方案1】:

    didReceiveData 在接收到一些 数据时被调用。当收到 more 数据时再次调用它。您必须收集数据(或在数据传入时对其进行处理,意识到它是不完整的),并且在数据完成时还有另一个回调。

    【讨论】:

    • 谢谢。这完全有道理,但是我似乎在 Apple 的文档中找不到这个 (developer.apple.com/library/prerelease/ios/documentation/…)
    • 糟糕,在移动设备上按发送太快了。你能指出我应该如何在 Swift 中做到这一点的正确方向吗?
    • 我可以为此使用 EnumerateByteRangesUsingBlock 而不是直接访问 bytes 属性吗?
    猜你喜欢
    • 2023-03-17
    • 1970-01-01
    • 2015-04-21
    • 2015-07-07
    • 2014-07-01
    • 2017-02-23
    • 2012-02-12
    • 2011-09-13
    • 2017-09-27
    相关资源
    最近更新 更多