我需要同步我在iOS应用中获得的一些后台线程。我需要一些东西来执行一个线程,而另一个线程完成它的工作,以保持代码的执行线性。
我整天都在使用这段代码,经过大量阅读后,我想出了这段代码:
-(void)waitOne:(double)timeout
{
if (!shouldRun)
{
shouldRun = true;
double runs = 0;
do {
NSDate* next = [NSDate dateWithTimeIntervalSinceNow:0.5];
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:next];
runs++;
} while ((runs/2) < timeout && shouldRun);
}
else
{
@throw [NSException exceptionWithName:@"InvalidHandle" reason:@"The currenct handle is in use" userInfo:nil];
}
}
我可以告诉你它完成了工作。但我也在论坛上发现了一些不好的反馈,我发现了该算法的想法,说“它会让你的循环忙等待”,这是一个坏主意。 所以,我来这里问。有没有更好的方法来实现我想要的目标?
答案 0 :(得分:0)
查看[NSCondition],它可以让您等待并发信号通知
基本上你分配了一个NSCondition并且在块中你将[条件等待];这将导致线程等待。然后,当异步操作完成时,调用[条件信号];这将表示等待线程继续。
http://developer.apple.com/DOCUMENTATION/Cocoa/Reference/NSCondition_class/Reference/Reference.html
答案 1 :(得分:0)
为了将来参考,如果有人需要,这是我的代码最终结果:
@implementation WaitHandle
@synthesize isWaiting;
-(void)waitOne:(double)timeout
{
if (!isWaiting)
{
isWaiting = true;
if (timeout <= 0) {
timeout = 0.1;
}
[handle waitUntilDate:[NSDate dateWithTimeIntervalSinceNow:timeout]];
}
}
-(void)signal
{
[handle signal];
}
-(id)init
{
self = [super init];
if (self != nil)
{
isWaiting = false;
handle = [[NSCondition alloc] init];
}
return self;
}
-(void)dealloc
{
[self signal];
}
@end