dispatch_semaphore_wait停止iPhone APP中的所有线程

时间:2011-10-31 06:35:22

标签: iphone objective-c asynchronous semaphore nsstream

我正在使用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 个答案:

答案 0 :(得分:4)

如果您从主线程调用[reader start],那么您正在创建死锁。您的流与主线程相关联:

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

这意味着它的工作主运行循环必须旋转。如果dispatch_semaphore_wait在主线程上,则表示您正在停止运行循环并阻止流处理其事件。

除了让dispatch_semaphore_signal永远不会返回之外,我看不出评论wait会做什么。