2010-05-24 9 views
27

Ho un oggetto NSData di circa 1000KB dimensioni. Ora voglio trasferirlo via Bluetooth. Sarebbe meglio se avessi, diciamo, 10 oggetti di 100kB. Mi viene in mente che dovrei usare il metodo -subdataWithRange: di NSData.Split NSData oggetti in altri oggetti NSData di una data dimensione

non ho davvero lavorato con NSRange. Bene, so come funziona, ma non riesco a capire come leggere da una determinata posizione con la lunghezza: 'alla fine del file' ... Non ho idea di come farlo.

Alcuni codice su come dividere questo in più oggetti 100kB NSData sarebbe davvero darmi una mano qui. (probabilmente richiede il metodo -length per vedere quanti oggetti dovrebbero essere realizzati ..?)

Grazie in anticipo.

+0

Anche per quanto riguarda la dimensione dei dati Bluetooth, da http://developer.apple.com/library/ios/#DOCUMENTATION/NetworkingInternet/Conceptual/GameKit_Guide/GameKitConcepts/GameKitConcepts.html "Per ottenere prestazioni ottimali, si raccomanda che la dimensione degli oggetti dati essere mantenuti piccoli (meno di 1000 byte di lunghezza). " – user149100

risposta

37

Il seguente pezzo di codice fa la frammentazione senza copiare i dati:

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); 

Sidenote: Vorrei aggiungere che gli oggetti Chunk non possono tranquillamente essere utilizzati dopo myBlob è stato rilasciato (o altre modifiche). chunk frammenti punto in memoria di proprietà di myBlob, in modo da non conservano a meno di conservare myBlob.

+0

Non lo capisco completamente. 'NSData * chunk = [NSData dataWithBytesNoCopy: [byte myBlob] + lunghezza offset: thisChunkSize freeWhenDone: NO];' sta lanciando un avvertimento, ovviamente. Non penso che tu possa dire '[myBlob bytes] + offset'. L'offset non ha nulla a che fare con i byte. Non sembro capire la tua logica qui. –

+0

Ho modificato il codice per rimuovere l'avviso del compilatore. Il resto del codice mi sembra giusto, anche se l'ho scritto senza test. 'offset' è la quantità di byte già elaborati. Ecco perché ogni nuovo blocco viene inizializzato all'inizio dell'array di dati più l'offset. –

+0

Stai dicendo che gli oggetti 'chunk' puntano nella memoria di proprietà di' myBlob'. Significa che quando trasferisco blocchi su bluetooth, saranno danneggiati dall'altra parte? O intendi che posso inviarli ma non saranno più disponibili dal lato del mittente dopo il rilascio di 'myBlob'? –