通过NSData发送的数据仅部分接收

时间:2016-03-14 21:34:09

标签: swift nsdata gamekit

尝试使用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

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

我可以在日志中看到随机数&lt;&gt;选择0并使用sendRandomNumber从设备发送。

单步执行didReceiveData我看到:

  1. message.messageType = .kMessageTypeRandomNumber(与struct初始化的值不同。另外,此值是在sendRandomNumber中设置的,所以我相信这部分会被正确发送。)
  2. messageRandomNumber.message.messageType = .kMessageTypeRandomNumber(再次更正)
  3. 但是,messageRandomNumber.randomNumber始终为0(这是不正确的)
  4. 这里有什么显而易见的东西吗?

1 个答案:

答案 0 :(得分:0)

在收到某些数据时调用didReceiveData。当收到更多数据时,会再次调用它。您必须收集数据(或在收到数据时进行处理,意识到它不完整),并且在数据完成时还有另一个回调。