Как преобразовать NSNumber в NSData?
Мне нужно передать целое число через GameKit с помощью sendDataToAllPeers:withDataMode:error:
, но я не знаю, как преобразовать NSNumber в NSData для отправки. В настоящее время у меня есть:
NSNumber *indexNum = [NSNumber numberWithInt:index];
[gkSession sendDataToAllPeers:indexNum withDataMode:GKSendDataReliable error:nil];
но, очевидно, indexNum необходимо преобразовать в NSData, прежде чем я могу его отправить. Кто-нибудь знает, как это сделать, пожалуйста?
Спасибо!
Ответы
Ответ 1
Я бы не рекомендовал NSKeyedArchiver
для такой простой задачи, потому что он добавляет накладные расходы PLIST поверх него и классное управление версиями.
Упаковка:
NSUInteger index = <some number>;
NSData *payload = [NSData dataWithBytes:&index length:sizeof(index)];
Send:
[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"
Ответ 2
Чтобы сохранить его:
NSData *numberAsData = [NSKeyedArchiver archivedDataWithRootObject:indexNum];
Чтобы преобразовать его в NSNumber:
NSNumber *indexNum = [NSKeyedUnarchiver unarchiveObjectWithData:numberAsData];
Ответ 3
Почему бы не отправить целое число прямо так:
NSData * indexData = [NSData dataWithBytes:&index length:sizeof(index)];
[gkSession sendDataToAllPeers:indexData withDataMode:GKSendDataReliable error:nil];
Ответ 4
Для более подробного примера отправки разных полезных данных вы можете проверить пример GKRocket, включенный в документацию XCode.