iphone - gamecenter - ¿Cómo convierto un NSNumber a NSData?
ipad game center (4)
Necesito transmitir un entero a través de GameKit usando sendDataToAllPeers:withDataMode:error:
pero no sé cómo convertir mi NSNumber a NSData para poder enviar. Actualmente tengo:
NSNumber *indexNum = [NSNumber numberWithInt:index];
[gkSession sendDataToAllPeers:indexNum withDataMode:GKSendDataReliable error:nil];
pero obviamente el indexNum necesita ser convertido a NSData antes de que pueda enviarlo. ¿Alguien sabe cómo hacer esto por favor?
¡Gracias!
¿Por qué no enviar el entero directamente así?
NSData * indexData = [NSData dataWithBytes:&index length:sizeof(index)];
[gkSession sendDataToAllPeers:indexData withDataMode:GKSendDataReliable error:nil];
No recomendaría NSKeyedArchiver
para una tarea tan simple, ya que agrega una sobrecarga de PLIST encima de eso y la versión de clase.
Paquete:
NSUInteger index = <some number>;
NSData *payload = [NSData dataWithBytes:&index length:sizeof(index)];
Enviar:
[session sendDataToAllPeers:payload withDataMode:GKSendDataReliable error:nil];
Desembalar (en el gestor de recepción GKSession):
NSUInteger index;
[payload getBytes:&index length:sizeof(index)];
Rápido
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"
Para almacenarlo:
NSData *numberAsData = [NSKeyedArchiver archivedDataWithRootObject:indexNum];
Para convertirlo de nuevo a NSNumber:
NSNumber *indexNum = [NSKeyedUnarchiver unarchiveObjectWithData:numberAsData];
Para obtener un ejemplo más detallado sobre cómo enviar diferentes cargas útiles, puede consultar el ejemplo de GKRocket incluido en la documentación de XCode.