Некоторое время работая с 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 в набор NSObjects размером менее 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
, содержащий содержимое вашего файла.
Надеюсь, это поможет - АЯЛ
person
Ayal
schedule
31.05.2010