GameKit Возможна ли многопоточная отправка?
Я работаю над приложением, которое может отправлять файлы и действия пользователям. Пользователи могут запросить файл в любое время с сервера (модель клиент-сервер). Иногда файлы могут быть довольно большими (например, 10 МБ), что при отправке может задержать отправку других небольших действий подключенным пользователям. Похоже, что Gamekit имеет один поток для отправки и отдельный для получения.
Мне интересно, возможно ли иметь дополнительный поток отправки, чтобы меньшие пакеты действий не ожидали отправки большого файла. Я попытался создать очередь с большой центральной диспетчеризацией, но, к сожалению, отправка по-прежнему использовала только один поток.
dispatch_async(pdfSendQ, ^{
NSString *filePath = [_document.fileURL path] ;
if (!_pdfNSData)
_pdfNSData = [NSData dataWithContentsOfFile:filePath];
for(NSData* packet in self.packets) {
NSError* error = nil;
[_session sendData:packet toPeers:[NSArray arrayWithObject:peerID] withDataMode:GKSendDataReliable error:&error];
if(error != nil) {
[[NSNotificationCenter defaultCenter] postNotificationName:kPacketFailedNotification object:self userInfo:[NSDictionary dictionaryWithObject:error forKey:@"error"]];
} else {
[[NSNotificationCenter defaultCenter] postNotificationName:kPacketSentNotification object:self];
}
}
[[NSNotificationCenter defaultCenter] postNotificationName:kFileSentNotification object:self];
});
Я думаю, что было бы возможно получить отдельные меньшие пакеты действий, чтобы "прервать" отправку большого файла, однако это было бы довольно сложно, и мне было интересно, существует ли намного более простой способ.
2 ответа
GKSession делает все действующие сети в своем собственном потоке. Посмотрите в lldb / Xcode для более подробной информации. Если вы хотите отправить 10 МБ порциями, просто отправьте данные. GKSession поставит в очередь записи для вас и отправит, когда это возможно, в фоновом потоке. Другими словами, не беспокойтесь об истощении основного потока, просто запишите данные.
Если честно, у меня нет опыта работы с GameKit, но, в конце концов, это должен быть потоковый сокет, верно? Вместо того, чтобы пытаться отправить огромный пакет с файлом 10 МБ, почему бы не отправить его небольшими кусками по 100 КБ. таким образом, вместо прерывания промежуточного блока, вы можете просто дождаться его завершения и поставить в очередь другой тип пакета (меньшие пакеты действия), о котором вы упомянули. С другой стороны, это просто вопрос сложения частей большого файла, но если вы получите что-то еще, вы сможете обработать его. Таким образом, вы получите его более отзывчивым