objective gamecenter game developer descargar apple iphone objective-c ios nsdata gamekit

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.