2016-07-19 5 views
0

У меня есть программа, которая отправляет большие файлы по 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.

ответ

0

В случае, если кто-либо натыкается на это и просто случается, чтобы увидеть то же самое я видел (и думаю, что то же самое, это проблема):

Проблема была не то, что потоковая вызывало проблемы - просто написав этот пост, я понял, насколько я абсурден. По-видимому, проблема заключалась в том, что базовые сокеты TCP были отключены после долгого ожидания приема данных. Я решил проблему, отправив сообщение о сердцебиении один раз в секунду, что сохраняет жилеты до тех пор, пока я не начну отправлять данные.

Смежные вопросы