Как я могу преобразовать NSNumber в NSData? - PullRequest
17 голосов
/ 14 января 2011

Мне нужно передать целое число через GameKit, используя sendDataToAllPeers:withDataMode:error:, но я не знаю, как преобразовать мой NSNumber в NSData для отправки. У меня сейчас есть:

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

но очевидно, что indexNum необходимо преобразовать в NSData, прежде чем я смогу его отправить. Кто-нибудь знает, как это сделать, пожалуйста?

Спасибо!

Ответы [ 4 ]

33 голосов
/ 14 января 2011

Я бы не рекомендовал 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)];

Swift

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"
19 голосов
/ 14 января 2011

Для сохранения:

NSData *numberAsData = [NSKeyedArchiver archivedDataWithRootObject:indexNum];

Чтобы преобразовать его обратно в NSNumber:

NSNumber *indexNum = [NSKeyedUnarchiver unarchiveObjectWithData:numberAsData]; 
4 голосов
/ 14 января 2011

Почему бы не отправить целое число прямо так:

NSData * indexData = [NSData dataWithBytes:&index length:sizeof(index)];
[gkSession sendDataToAllPeers:indexData withDataMode:GKSendDataReliable error:nil];
0 голосов
/ 14 января 2011

Более подробный пример того, как отправлять различные полезные данные, вы можете посмотреть в примере GKRocket, включенном в документацию XCode.

...