0

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

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

4

2 回答 2

0

查看 [NSCondition] 使您能够等待和信号线程

基本上你分配一个 NSCondition 并且在块中你将有 [condition wait]; 这将导致线程等待。然后,当异步操作完成时,您调用 [条件信号];这将发出等待线程继续的信号。

http://developer.apple.com/DOCUMENTATION/Cocoa/Reference/NSCondition_class/Reference/Reference.html

于 2013-06-07T05:39:57.253 回答
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
于 2013-06-07T12:56:11.857 回答