У меня есть программа, которая отправляет большие файлы по NSStreams после некоторой начальной обработки. Поток приложения выглядит следующим образом:Записывает NSOutputStream после выполнения работы над фоновым потоком не работает
1) Два устройства соединяются друг с другом, открывают свои входные и выходные потоки, и график их запуска петли:
[self.inputStream setDelegate:self];
[self.outputStream setDelegate:self];
[self.inputStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
[self.outputStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
[self.inputStream open];
[self.outputStream open];
2) Устройство Сервер отправляет сообщение для клиента, указывающего, что все хорошо, и мы все готовы. Клиент получает это сообщение просто отлично.
3) Затем клиент выбирает список файлов, которые он хочет отправить на сервер, и нажимает «отправить». Затем клиент отбрасывает фоновый поток, чтобы захватить кучу файлов и закрепить их все. Это может занять около минуты или около того.
- (void) sendFilesAtPaths: (NSArray *) paths
{
self.paths = [paths copy];
__weak FileSharingClient *weakSelf = self;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
for(Item *item in weakSelf.paths)
{
//Zip files up, this can take some time but we're on a background thread so it won't lock up the UI
[weakSelf.connection zipFilesAssociatedWithItem:item];
}
//Now that we've done all the heavy work, bounce back to the main thread to actually start sending the data
dispatch_async(dispatch_get_main_queue(), ^{
//Start by sending only the first file, the server will let us know when they are ready for the next one
[weakSelf.connection sendFileWithItem:weakSelf.paths.firstObject];
});
});
}
4) Вызов «sendFileWithItem:» поставляет первый информационный пакет, сделав следующий вызов:
if([_outputStream hasSpaceAvailable])
{
NSInteger written = [self.outputStream write:buffer maxLength:self.outputHeaderSize];
}
Все следующие данные передаются путем отправки данных через вызовы, сделанные в - (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)streamEvent
проблема
проблема, которую я вижу в том, что я f фоновый поток для zip-файлов для этих файлов занимает больше времени, первоначальный вызов для записи данных. Указывает, что байты были записаны в поток, но я никогда не получал никаких вызовов в - (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)streamEvent
. Сервер никогда не получает информацию. Где-то около 30 секунд позже команда записи (я предполагаю?) Истекает, клиент получает пустую строку (НЕ отправляется явным образом от меня с сервера), и соединение клиента закрывается.
Если я отправляю файл, который не заставит себя долго ждать, я не вижу этой проблемы.
Выполнение всего, что связано с основной нитью, включая процесс zipping, не решает проблему (даже если игнорировать факт блокировки пользовательского интерфейса). Это, по-видимому, исключает проблему потоковой передачи, но это все, что мне нужно продолжить прямо сейчас.
У меня полно идей, я надеюсь, что кто-то может мне помочь.
Примечание: В ожидании этого предложения я не могу использовать библиотеку CocoaAsyncSockets.