从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];在MyThreadRun的末尾,我尝试调用类中的一个函数MyMethod来启动线程,如下所示:
NSObject* callbackTarget = [args objectAtIndex:1];
NSString* selector = [args objectAtIndex:2];
[callbackTarget performSelector:NSSelectorFromString(selector) withObject:calculationResult afterDelay:0];我在选择器所指向的方法上有一个断点,它永远不会命中。
如果我硬编码方法名,如下所示
[callbackTarget updateWithResult:calculationResult] 它工作得很好。
关于performSelector,我需要了解哪些内容?
发布于 2011-08-28 13:51:04
performSelector:withObject:afterDelay:被调用的上下文是罪魁祸首。下面是正在发生的事情。
一些performSelector成员..。这个家族不会立即执行选择器;它们会在当前的run循环中对调用进行排队,这样它就会在您的fn返回之后发生,也就是run循环的下一轮循环。根据苹果的说法:“指定延迟为0并不一定会导致选择器立即执行。选择器仍然会在线程的run循环中排队,并会尽快执行。”
通常情况下,这是可以预期的。但是你的代码在你手动启动的线程上调用它...这样的线程不会像主线程那样重复运行它们的run循环。它们调用创建时指定的选择器一次,然后退出。因此:您的代码将回调选择器的调用排入队列,但随后线程退出;它的run循环被抛出而不再运行……所以你的排队调用永远不会发生。
您可能需要的是performSelectorOnMainThread:withObject:waitUntilDone:,因为您可能希望回调发生在最初调用MyMethod方法的线程上,该线程可能是主线程。
更广泛地说,线程是非常棘手的东西。我强烈建议您查看NSOperationQueue、NSBlockOperation和相关技术-它们可以大大减轻您的痛苦。
发布于 2011-08-28 13:28:48
是
NSString* selector = [args objectAtIndex:2];等于updateWithResult或updateWithResult:
这是两种不同的方法。你想要有冒号的那个。
发布于 2011-08-28 13:32:20
去掉"afterDelay:0“,你的代码就可以工作了。另外,"MyThreadRun start“应该是"mythread start”。
https://stackoverflow.com/questions/7219131
复制相似问题