线程问题

时间:2011-06-22 08:24:42

标签: iphone objective-c xcode nsthread springboard

我迷上了SpringBoard方法,我想等待某个事件发生,然后继续我的代码,但无论我尝试什么 - 我认为它暂停主线程,然后所有线程停止。我的代码是:

+(void) startc {
    while([currentNumber isEqual:@""])
    {
        NSLog(@"waiting until currentNumber is not empty %@", currentNumber);
    }
}

id replaced_SBCallAlert_initWithCall_(id self, SEL _cmd, CTCallRef call) {  // Note the 
        NSLog(@"calling replaced");
            [cdBackground startc];
        original_SBCallAlert_initWithCall_(sbc, scc, cls); 
            return NULL;
    }

currentNumber在另一个线程中更新,但此代码会阻止它。

1 个答案:

答案 0 :(得分:1)

while中的startc循环实际上是一个自旋锁定,并且会阻止执行它的线程进一步进展,直到currentNumber不是@""。如果同一个线程负责更改currentNumber,那么是 - 你有一个死锁。看起来就是这种情况,因为我猜您希望调用original_SBCallAlert_initWithCall_来更改此变量,但会卡在上一行的startc调用中。

在这种情况下,您必须更改程序的设计方式。您可以将startc置于后台线程中(查看NSThread)并使用另一个自旋锁,NSCondition或键值观察以在currentNumber具有“唤醒”时改变。然后,您可以使用NSObject performSelectorOnMainThread …(假设您有一个runloop)在“主”线程中再次启动代码,或者在后台线程中继续运行。