PerformSelector不工作

MyThreadRun方法是这样调用MyMethod的

NSArray* args = [NSArray arrayWithObjects:arg1, target, NSStringFromSelector(mySelector), nil]; NSThread* mythread= [[[NSThread alloc] initWithTarget:self selector: @selector(MyThreadRun:) object:args] autorelease]; [MyThreadRun start]; 

在MyThreadRun的最后,我尝试在调用MyMethod的类中调用一个函数来初始化线程,如下所示:

 NSObject* callbackTarget = [args objectAtIndex:1]; NSString* selector = [args objectAtIndex:2]; [callbackTarget performSelector:NSSelectorFromString(selector) withObject:calculationResult afterDelay:0]; 

我在select器指向的方法上有一个断点,并且它从来没有命中。

如果我硬编码的方法名称,像这样

 [callbackTarget updateWithResult:calculationResult] 

它工作正常。

有什么我需要知道关于performSelector?

performSelector:withObject:afterDelay:被调用的上下文是罪魁祸首。 这是怎么回事

performSelector …系列的一些成员,就像这个一样,不会马上执行select器; 他们在当前运行循环中排队调用,以便在你的fn返回后运行循环的下一轮。 根据苹果的说法:“指定延迟0不一定会导致select器立即执行,select器仍在队列的运行循环中排队,并尽快执行。

通常这是很好的和预期的。 但是你的代码在你手动启动的线程上调用它…而这样的线程不会像主线程那样反复地运行循环。 他们调用创build时指定的select器一次,然后退出。 所以:你的代码将调用你的callbackselect器,但是这个线程退出; 而且它的运行循环也不会运行,所以你的排队调用永远不会发生。

你可能需要的是performSelectorOnMainThread:withObject:waitUntilDone:因为你可能希望callback发生在首先调用MyMethod方法的线程上,这可能是主线程。

更一般地说,线程是非常棘手的东西。 我强烈build议检查一下NSOperationQueueNSBlockOperation和相关技术 – 它们可以消除很多痛苦。

 NSString* selector = [args objectAtIndex:2]; 

等于updateWithResultupdateWithResult:?

他们是两种不同的方法。 你想要冒号的那个。

删除“afterDelay:0”,你的代码工作。 另外“[MyThreadRun开始]”应该是“[mythread start]”。