如何将NSNumber转换为NSData?

时间:2011-01-14 09:39:49

标签: iphone objective-c ios nsdata gamekit

我需要使用sendDataToAllPeers:withDataMode:error:通过GameKit传输整数,但我不知道如何将我的NSNumber转换为NSData以便发送。我目前有:

NSNumber *indexNum = [NSNumber numberWithInt:index];
[gkSession sendDataToAllPeers:indexNum withDataMode:GKSendDataReliable error:nil];

但很明显,在我发送之前,indexNum需要转换为NSData。有谁知道怎么做?

谢谢!

4 个答案:

答案 0 :(得分:33)

我不建议NSKeyedArchiver执行这么简单的任务,因为它会在它上面加上PLIST开销和类版本。

包:

NSUInteger index = <some number>;
NSData *payload = [NSData dataWithBytes:&index length:sizeof(index)];

发送:

[session sendDataToAllPeers:payload withDataMode:GKSendDataReliable error:nil];

解包(在GKSession接收处理程序中):

NSUInteger index;
[payload getBytes:&index length:sizeof(index)];

夫特

var i = 123
let data = NSData(bytes: &i, length: sizeof(i.dynamicType))

var i2 = 0
data.getBytes(&i2, length: sizeof(i2.dynamicType))

print(i2) // "123"

答案 1 :(得分:19)

存储它:

NSData *numberAsData = [NSKeyedArchiver archivedDataWithRootObject:indexNum];

将其转换回NSNumber:

NSNumber *indexNum = [NSKeyedUnarchiver unarchiveObjectWithData:numberAsData]; 

答案 2 :(得分:4)

为什么不直接发送整数:

NSData * indexData = [NSData dataWithBytes:&index length:sizeof(index)];
[gkSession sendDataToAllPeers:indexData withDataMode:GKSendDataReliable error:nil];

答案 3 :(得分:0)

有关如何发送不同有效负载的更详细示例,您可以检查XCode文档中包含的GKRocket示例。