【发布时间】:2016-06-23 07:50:11
【问题描述】:
这是场景:我想添加一个观察者来监控事件&当一个事件被触发和处理时,我在回调块中等待结果,如果结果很好,我做其他任务。如果等待超时,我只打印错误消息。
我使用 semaphore 来实现上面的事情,简单的代码如下:
-(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,信号量得到信号并且等待停止,doOtherTask被调用,一切都按预期工作。
但是对于第二次调用,当事件触发时,result 是YES,semaphore 得到信号,但代码仍在等待超时,然后打印超时错误。
为什么?为什么即使信号量收到信号,第二次调用代码仍在等待信号量?在这种情况下可能的原因是什么?以及如何使第二次通话也按预期工作?
===== 更新:我找到了原因,但如何解决? ====
我意识到回调被多次调用,这意味着相同的信号量已被多次发出信号。我认为这就是我的问题的原因。但是,如何摆脱这个问题呢?那有什么办法呢?
【问题讨论】:
-
函数是否在主线程调用?
-
是的,在主线程中调用
-
@Leem.fin 第二次调用是指第二次调用方法 waitForResultThenDoOtherTask() 吗?
-
@pnizzle,是的,完全正确。所以,一般来说,我调用这个函数两次,在这之间,我调用另一个函数来删除一些本地文件,那个操作在另一个线程中。如果您阅读我在代码中的评论,您就会明白我的意思。
-
好吧,让我看看能不能给你写点东西。
标签: ios objective-c semaphore