2010-05-24 14 views
27

Tengo un objeto NSData de aproximadamente 1000 kB de tamaño. Ahora quiero transferir esto a través de Bluetooth. Sería mejor si tuviera, digamos, 10 objetos de 100kB. Me viene a la mente que debería usar el método -subdataWithRange: de NSData.Dividir objetos NSData en otros objetos NSData de un tamaño determinado

Realmente no he trabajado con NSRange. Bueno, sé cómo funciona, pero no puedo entender cómo leer desde un lugar determinado con la longitud: 'hasta el final del archivo' ... No tengo idea de cómo hacerlo.

Cierto código sobre cómo dividir esto en múltiples objetos NSData de 100 kB realmente me ayudaría aquí. (probablemente involucre el método -length para ver cuántos objetos se deben hacer ...?)

Gracias de antemano.

+0

También en relación con el tamaño de datos Bluetooth, desde http://developer.apple.com/library/ios/#DOCUMENTATION/NetworkingInternet/Conceptual/GameKit_Guide/GameKitConcepts/GameKitConcepts.html "Para un mejor rendimiento, se recomienda que el tamaño de los objetos de datos se mantendrá pequeño (menos de 1000 bytes de longitud) ". – user149100

Respuesta

37

El siguiente fragmento de código hace la fragmentación sin copiar los datos:

NSData* myBlob; 
NSUInteger length = [myBlob length]; 
NSUInteger chunkSize = 100 * 1024; 
NSUInteger offset = 0; 
do { 
    NSUInteger thisChunkSize = length - offset > chunkSize ? chunkSize : length - offset; 
    NSData* chunk = [NSData dataWithBytesNoCopy:(char *)[myBlob bytes] + offset 
             length:thisChunkSize 
            freeWhenDone:NO]; 
    offset += thisChunkSize; 
    // do something with chunk 
} while (offset < length); 

Nota al margen: Debo añadir que los objetos trozo no se pueden utilizar con seguridad después de myBlob ha sido liberado (o modificado de otro modo). chunk fragmentos apuntan a la memoria propiedad de myBlob, por lo que no los retenga a menos que conserve myBlob.

+0

No estoy entendiendo por completo eso. 'NSData * chunk = [NSData dataWithBytesNoCopy: [myBlob bytes] + offset length: thisChunkSize freeWhenDone: NO];' lanza una advertencia, por supuesto. No creo que puedas decir '[myBlob bytes] + offset'. Offset no tiene nada que ver con los bytes. No parece entender tu lógica aquí. –

+0

Edité el código para eliminar la advertencia del compilador. El resto del código me parece correcto, aunque lo escribí sin pruebas. 'offset' es la cantidad de bytes ya procesados. Es por eso que cada nuevo fragmento se inicializa al comienzo de la matriz de datos más el 'offset'. –

+0

Estás diciendo que los objetos 'chunk' apuntan a la memoria propiedad de' myBlob'. ¿Significa esto que cuando transfiero trozos a través de bluetooth estarán dañados en el otro lado? ¿O quiere decir que puedo enviarlos pero ya no estarán disponibles del lado del remitente después de liberar 'myBlob'? –