dispatch_semaphore_wait останавливает ВСЕ потоки в приложении iPhone - PullRequest
2 голосов
/ 31 октября 2011

Я использую dispatch_semaphore_wait, чтобы остановить текущий поток, но похоже, что он останавливает все мои потоки.

Код:

SampleReader *reader = [[SampleReader alloc] initWithHostname:hostname andFilePath:filepath];
reader.endHandler = endHandler;

[reader start];

dispatch_semaphore_wait(reader->mSem, DISPATCH_TIME_FOREVER);

Мой метод запуска имеет что-то вроде:

mFileStream = [[NSOutputStream outputStreamToFileAtPath:[fileurl path] append:FALSE] retain];
[mFileStream open];

mNetworkStream = (NSInputStream *)CFReadStreamCreateWithFTPURL(NULL, (CFURLRef)ftpurl);
mNetworkStream.delegate = self;
[mNetworkStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
[mNetworkStream open];

Я получаю обратный вызов в одном из методов делегата, в котором я передаю сигнал семафору

- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode{

  switch (eventCode)
  Case NSStreamEventErrorOccurred:
                    dispatch_semaphore_signal(mSem);
        break;
    case NSStreamEventEndEncountered:
        dispatch_semaphore_signal(mSem);
        break;

}

Однако, когда я отправляю ожидание на семафор, метод делегата не вызывается,Он вызывается только когда я закомментирую строку

 //dispatch_semaphore_signal(mSem);

Любая помощь будет принята с благодарностью.

1 Ответ

4 голосов
/ 31 октября 2011

Если вы звоните [reader start] из основного потока, вы создаете тупик. Ваш поток связан с основным потоком здесь:

[mNetworkStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];

Это означает, что для того, чтобы он работал, основной цикл запуска должен вращаться. Если dispatch_semaphore_wait находится в основном потоке, вы останавливаете цикл выполнения и не позволяете потоку обрабатывать его события.

Я не понимаю, как комментирование dispatch_semaphore_signal могло бы что-то сделать, кроме того, что wait никогда не вернется.

...