首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PerformSelector不工作

PerformSelector不工作
EN

Stack Overflow用户
提问于 2011-08-28 13:03:56
回答 3查看 3.9K关注 0票数 2

从MyMethod调用MyThreadRun方法,如下所示

代码语言:javascript
复制
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来启动线程,如下所示:

代码语言:javascript
复制
NSObject* callbackTarget = [args objectAtIndex:1];
NSString* selector = [args objectAtIndex:2];
[callbackTarget performSelector:NSSelectorFromString(selector) withObject:calculationResult afterDelay:0];

我在选择器所指向的方法上有一个断点,它永远不会命中。

如果我硬编码方法名,如下所示

代码语言:javascript
复制
[callbackTarget updateWithResult:calculationResult] 

它工作得很好。

关于performSelector,我需要了解哪些内容?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-08-28 13:51:04

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

一些performSelector成员..。这个家族不会立即执行选择器;它们会在当前的run循环中对调用进行排队,这样它就会在您的fn返回之后发生,也就是run循环的下一轮循环。根据苹果的说法:“指定延迟为0并不一定会导致选择器立即执行。选择器仍然会在线程的run循环中排队,并会尽快执行。”

通常情况下,这是可以预期的。但是你的代码在你手动启动的线程上调用它...这样的线程不会像主线程那样重复运行它们的run循环。它们调用创建时指定的选择器一次,然后退出。因此:您的代码将回调选择器的调用排入队列,但随后线程退出;它的run循环被抛出而不再运行……所以你的排队调用永远不会发生。

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

更广泛地说,线程是非常棘手的东西。我强烈建议您查看NSOperationQueueNSBlockOperation和相关技术-它们可以大大减轻您的痛苦。

票数 23
EN

Stack Overflow用户

发布于 2011-08-28 13:28:48

代码语言:javascript
复制
NSString* selector = [args objectAtIndex:2];

等于updateWithResultupdateWithResult:

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

票数 4
EN

Stack Overflow用户

发布于 2011-08-28 13:32:20

去掉"afterDelay:0“,你的代码就可以工作了。另外,"MyThreadRun start“应该是"mythread start”。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7219131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档