Проблема передачи Bluetooth через GameKit - PullRequest
3 голосов
/ 21 мая 2010

Я пытаюсь отправить файл через Bluetooth с помощью платформы GameKit.Однако проблема в том, что я могу отправлять только один объект NSData за раз, но мне нужно сохранить его на другом конце.это очевидно невозможно без знания имени файла, но я не знаю, как это передать.Я пытался преобразовать его в строку NSData*data = [NSData dataWithContentsOfFile:urlAddress];, но я могу отправить только один объект NSData, а не два.

Кто-нибудь еще сталкивался с этой проблемой?

1 Ответ

13 голосов
/ 01 июня 2010

Работая с GameKit некоторое время, я обнаружил, что существует ограничение около 90 КБ на «отправку», поэтому, если размер файла превышает 90 КБ, вам придется его разбить.Вот как я бы посоветовал вам разобраться:

1-й - Отправьте имя вашего файла

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

2-й - Отправьте количество чанков, которые вы собираетесь отправить

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-й - Разбейте и отправьте свой объект NSData в набор объектов NSO менее 50 КБ каждый (просто для того, чтобы быть в безопасном размере)

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'  
}

На принимающей стороне вы захотитевыполните следующие действия:

1-й - получите имя файла

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

2-й - получите количество чанков, которые вы собираетесь получить

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

3-й - получитекуски данных

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

Если все работало правильно, теперь у вас будет объект fileNameStr, содержащий имя вашего файла, и объект data, содержащий содержимое вашего файла.

Hopeэто помогает - AYAL

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...