2010-05-24 5 views
27

J'ai un objet NSData d'environ 1000 Ko de taille. Maintenant, je veux transférer cela via Bluetooth. Ce serait mieux si j'avais, disons, 10 objets de 100kB. Il me vient à l'esprit que je devrais utiliser la méthode -subdataWithRange: de NSData.Diviser les objets NSData en d'autres objets NSData d'une taille donnée

Je n'ai pas vraiment travaillé avec NSRange. Eh bien, je sais comment cela fonctionne, mais je n'arrive pas à comprendre comment lire à partir d'un endroit donné avec la longueur: «jusqu'à la fin du fichier» ... Je ne sais pas comment faire ça.

Un code sur la façon de diviser cela en plusieurs objets NSData de 100 Ko m'aiderait vraiment ici. (cela implique probablement la méthode -length pour voir combien d'objets devraient être faits ..?)

Merci d'avance.

+0

également en ce qui concerne la taille des données Bluetooth, de http://developer.apple.com/library/ios/#DOCUMENTATION/NetworkingInternet/Conceptual/GameKit_Guide/GameKitConcepts/GameKitConcepts.html « Pour des performances optimales, il est recommandé que la taille des objets de données doivent rester petits (moins de 1000 octets de longueur). " – user149100

Répondre

37

La pièce suivante de code ne la fragmentation sans copier les données:

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: Je dois ajouter que les objets gros morceau ne peuvent pas être utilisés sans risque après myBlob a été libéré (ou autrement modifiées). chunk fragments pointent dans la mémoire détenue par myBlob, donc ne les conserve pas sauf si vous conservez myBlob.

+0

Je ne comprends pas complètement cela. 'NSData * chunk = [NSData dataWithBytesNoCopy: [myBlob octets] + longueur de décalage: thisChunkSize freeWhenDone: NO];' lance un avertissement bien sûr. Je ne pense pas que vous pouvez dire '[myBlob bytes] + offset'. Le décalage n'a rien à voir avec les octets. Je ne semble pas comprendre votre logique ici. –

+0

J'ai modifié le code pour supprimer l'avertissement du compilateur. Le reste du code me semble juste, même si je l'ai écrit sans test. 'offset' est la quantité d'octets déjà traités. C'est pourquoi chaque nouveau segment est initialisé au début du tableau de données plus le 'offset'. –

+0

Vous dites que les objets 'chunk' pointent dans la mémoire appartenant' myBlob'. Cela signifie-t-il que lorsque je transfère des morceaux sur bluetooth, ils seront corrompus de l'autre côté? Ou voulez-vous dire que je peux les envoyer mais ils ne seront plus disponibles du côté de l'expéditeur après avoir lancé 'myBlob'? –