我迷上了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在另一个线程中更新,但此代码会阻止它。
答案 0 :(得分:1)
while
中的startc
循环实际上是一个自旋锁定,并且会阻止执行它的线程进一步进展,直到currentNumber
不是@""
。如果同一个线程负责更改currentNumber
,那么是 - 你有一个死锁。看起来就是这种情况,因为我猜您希望调用original_SBCallAlert_initWithCall_
来更改此变量,但会卡在上一行的startc
调用中。
在这种情况下,您必须更改程序的设计方式。您可以将startc
置于后台线程中(查看NSThread
)并使用另一个自旋锁,NSCondition
或键值观察以在currentNumber
具有“唤醒”时改变。然后,您可以使用NSObject performSelectorOnMainThread …
(假设您有一个runloop)在“主”线程中再次启动代码,或者在后台线程中继续运行。