2010-05-20 5 views
3

J'essaie d'envoyer un fichier via Bluetooth en utilisant le framework GameKit. Le problème que je rencontre est que je ne peux envoyer qu'un seul objet NSData à la fois, mais je dois le sauvegarder à l'autre bout. ceci n'est évidemment pas possible sans connaître le nom de fichier, mais je ne sais pas comment le transmettre. J'ai essayé de le convertir en une chaîne NSData*data = [NSData dataWithContentsOfFile:urlAddress]; mais je peux seulement envoyer un objet NSData, pas deux.Problème de transfert Bluetooth GameKit

Quelqu'un a-t-il déjà rencontré ce problème?

Répondre

13

Travailler avec le GameKit pendant un moment J'ai trouvé qu'il y a une limite d'environ 90k par 'envoyer' donc si votre fichier est plus grand que 90k vous devrez le casser. Voici comment je vous suggère de briser les choses:

1er - Envoyer le nom de votre fichier

NSData* fileNameData = [fileNameStr dataUsingEncoding: NSASCIIStringEncoding]; 
// send 'fileNameData' 

2 - Envoyer le nombre de morceaux vous allez envoyer

NSUInteger fiftyK = 51200; 
NSUInteger chunkCount = (((NSUInteger)(srcData.length/fiftyK)) + ((srcData.length % fiftyK) == 0) ? 0 : 1)) 
NSString chunkCountStr = [NSString stringWithFormat:@"%d",chunkCount]; 
NSData* chunkCountData = [chunkCountStr dataUsingEncoding: NSASCIIStringEncoding]; 
// send 'chunkCountData' 

3 - Décomposer et envoyer votre objet NSData dans un ensemble de NSObjects de moins de 50k chacun (juste pour être sur la taille de sécurité)

NSData *dataToSend; 
NSRange range = {0, 0}; 
for(NSUInteger i=0;i<srcData.length;i+=fiftyK){ 
    range = {i,fiftyK}; 
    dataToSend = [srcData subdataWithRange:range]; 
    //send 'dataToSend' 
} 
NSUInteger remainder = (srcData.length % fiftyK); 
if (remainder != 0){ 
    range = {srcData.length - remainder,remainder}; 
    dataToSend = [srcData subdataWithRange:range]; 
    //send 'dataToSend' 
} 

Du côté de la réception, vous aurez envie de faire ce qui suit:

1er - Recevoir le nom du fichier

// Receive data 
NSString* fileNameStr = [[NSString alloc] initWithData:receivedData encoding:NSASCIIStringEncoding] 

2 - Recevoir le nombre de morceaux que vous êtes sur le point de recevoir

// Receive data 
NSString* chunkCountStr = [[NSString alloc] initWithData:receivedData encoding:NSASCIIStringEncoding] 
NSUInteger chunkCount = [chunkCount intValue]; 

3e - Recevoir les blocs de données

NSMutableData data = [[NSMutableData alloc]init]; 
for (NSUInteger i=0; i<chunkCount;i++){ 
    // Receive data 
    [data appendData:receivedData]; 
} 

Si tout a fonctionné correctement t vous allez maintenant avoir un objet fileNameStr contenant votre nom de fichier et un objet data contenant le contenu de votre fichier.

Hope this helps - Ayal

+0

Merci Ayal pour votre réponse détaillée, je vais vérifier votre code prochainement et vous faire savoir comment ça se passait. – Pripyat

+0

Bonne réponse! :) Merci beaucoup. – Nick

+0

Quelqu'un at-il un projet qui fait cela, mais je ne suis pas sûr du bit de nom de fichier. Je veux envoyer une photo – Burf2000

Questions connexes