PerformSelector不工作

Hao*_*est 2 multithreading objective-c ios

像这样从MyMethod调用MyThreadRun方法

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

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

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

我在选择器指向的方法上有一个断点,它永远不会被击中.

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

[callbackTarget updateWithResult:calculationResult] 
Run Code Online (Sandbox Code Playgroud)

它工作正常.

关于performSelector,我需要了解什么?

rge*_*rge 23

performSelector:withObject:afterDelay:被调用的上下文是罪魁祸首.这是正在发生的事情.

performSelector像这样的......家庭的一些成员不会立即执行选择; 它们在当前运行循环上排队调用,以便在fn返回之后发生,这是运行循环的下一个循环.根据apple的说法:"指定延迟为0并不一定会导致选择器立即执行.选择器仍然在线程的运行循环中排队并尽快执行."

通常,这很好,并且预期.但是你的代码在你手动启动的线程上调用它...而且这样的线程不会像主线程那样重复运行循环.他们调用在创建时指定的选择器,然后退出.所以:你的代码排队调用你的回调选择器,然后线程退出; 并且它的运行循环被抛弃而没有运行...所以你的排队调用永远不会发生.

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

更一般地说,线程是非常棘手的东西.我强烈建议退房NSOperationQueue,NSBlockOperation以及相关技术 - 他们可以消除很多痛苦.