如何在比赛中将数据从 GKPlayer 发送到另一个?

How do I send data from a GKPlayer to another in a match?

我想在一场比赛中将 NSData 从一个 GKPlayer 发送到另一个。因此,sendDataToAllPlayers(_:withDataMode:error:)的方法最为理想。

func sendDataToAllPlayers(data: Int,
    withDataMode Reliable: GKMatchSendDataMode,
    error: NSErrorPointer) -> Bool {

    return true
}

但是,如何使用上述方法发送 Int 变量?

var score:Int = 0
extension Int {
    var data: NSData {
        var source = self
        return NSData(bytes: &source, length: sizeof(Int))
    }
}
extension Double {
    var data: NSData {
        var source = self
        return NSData(bytes: &source, length: sizeof(Double))
    }
}
extension NSData {
    var integerValue:Int {
        var result = 0
        getBytes(&result, length: sizeof(Int))
        return result
    }
    var doubleValue:Double {
        var result:Double = 0
        getBytes(&result, length: sizeof(Double))
        return result
    }
}

let myIntegerData = 123.data                 // _NSInlineData
let backToInt = myIntegerData.integerValue   // 123

let myDoubleData = 123.456789.data           // _NSInlineData
let backToDouble = myDoubleData.doubleValue  // 123.456789

这个用于将 Int(或其他类型)封装到 NSData 或从中提取它的版本应该可以在具有不同字节顺序的设备之间工作:

// at sender before sending data
let data = NSMutableData()
let archiver = NSKeyedArchiver(forWritingWithMutableData: data)
archiver.encodeInteger(score, forKey: "score")
archiver.finishEncoding()

// at receiver after receiving data
let unarchiver = NSKeyedUnarchiver(forReadingWithData: data)
let score = unarchiver.decodeIntegerForKey("score")
unarchiver.finishDecoding()