这是情景:我想补充观察员监视事件&当触发事件&处理,我等待结果的回调块,如果结果是好吧,我做其他任务。如果等待超时,我只是打印错误信息。信号灯不起作用
我用信号实现与下面的简单代码上面的事情:
-(void)waitForResultThenDoOtherTask {
BOOL shouldPrintErr = NO;
// I create a semaphore
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
// I have an observer with a callback, the callback is triggered when event is observed & result is passed to callback
[self addObserver:myObserver withCallback:callback];
id callback = ^(BOOL result) {
// if result is YES, I signal semaphore, otherwise, set shouldPrintErr flag to YES
if (result) {
dispatch_semaphore_signal(semaphore);
} else {
shouldPrintErr = YES;
}
}
// wait until timeout
dispatch_time_t timeOut = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(10 * NSEC_PER_SEC));
dispatch_semaphore_wait(semaphore, timeOut);
if (shouldPrintErr) {
NSLog(@"TIME OUT!!!");
} else {
// do other task
[self doOtherTask];
}
}
我所说的以上功能在另一类是这样的:
// 1st call
[object waitForEventThenDoOtherTask];
// this function delete local files (in another thread)
[self deleteLocalFileInAnotherThread];
// 2nd call
[object waitForEventThenDoOtherTask];
第一个呼叫工作正常,当事件被触发时,result
是YES
,信号量得到sig最后等待,doOtherTask
被调用,一切都按预期工作。
但第二个呼叫,当触发事件,result
是YES
,旗语得到信号,但代码仍然在等待,直到超时,然后在打印超时错误。
为什么?即使信号量获得信号,为什么第二次调用代码仍在等待信号量?在这方面可能的原因是什么?如何让第二个电话按预期工作?
=====更新:我找到了原因,但如何解决? ====
我意识到多次调用回调,这意味着相同的信号量已被多次发信号。我认为这是我的问题的原因。但是,如何摆脱这个问题呢?那么解决方案是什么?
函数是否在主线程上调用? – Code
是的,它被称为主线程 –
@ Leem.fin通过第二次调用你的意思是第二次调用方法waitForResultThenDoOtherTask()? – pnizzle