同步iOS的线程

时间:2013-06-07 03:14:06

标签: ios multithreading cocoa-touch synchronization

我需要同步我在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];
}
}

我可以告诉你它完成了工作。但我也在论坛上发现了一些不好的反馈,我发现了该算法的想法,说“它会让你的循环忙等待”,这是一个坏主意。 所以,我来这里问。有没有更好的方法来实现我想要的目标?

2 个答案:

答案 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