gpt4 book ai didi

iphone - dispatch_semaphore_wait 停止 iPhone APP 中的所有线程

转载 作者:行者123 更新时间:2023-12-03 20:45:36 25 4
gpt4 key购买 nike

我正在使用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];

我在其中一个委托(delegate)方法中得到回调,其中我向信号量发出信号

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

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

}

但是,当我发送等待信号量时,不会调用委托(delegate)方法。仅当我注释掉该行时才调用它

 //dispatch_semaphore_signal(mSem);

任何帮助将不胜感激。

最佳答案

如果您从主线程调用[reader start],那么您就会造成死锁。您的流正在与此处的主线程关联:

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

这意味着要使其工作,主运行循环必须旋转。如果 dispatch_semaphore_wait 位于主线程上,则您将停止运行循环并阻止流处理其事件。

我不明白注释掉 dispatch_semaphore_signal 除了使 wait 永远不会返回之外还有什么作用。

关于iphone - dispatch_semaphore_wait 停止 iPhone APP 中的所有线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7950588/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com