我正在开发一个使用第三方SDK的iPad项目,并且已经阅读了SDK代码以了解它和objective-c。我在异步回调中遇到了以下行:
[self performSelector:@selector(doSomething) withObject:nil afterDelay:0];
我已阅读该选择器上的the documentation。相关的行似乎如下:
指定延迟0并不一定会导致选择器立即执行。选择器仍然在线程的运行循环中排队,并尽快执行。
我无法确定为什么要写[self performSelector:@selector(doSomething) withObject:nil afterDelay:0]
,而不是仅仅写[self doSomething]
。在我看来,延迟为零意味着应该立即进行呼叫。显然我遗漏了一些东西,框架作者不太可能随意选择这种方法。其他StackOverflow答案也没有说明这一点。是否使用了“performSelector”选择器,因为doSomething选择器本身是异步的,并且调用是在异步回调中进行的?
我确实发现another link建议如下:
有趣的是,使用performSelector和afterDelay也会让警告[即,编译器警告]消失:...
[self performSelector:aSelector withObject:nil afterDelay:0.0];
作者是否也使用此代码来仅抑制编译器警告?如果是这种情况,那么最好通过clang push / pops来抑制警告,如this thread中所示。
如果有人有一个有说服力的解释为什么作者使用... afterDelay方法,我将不胜感激。感谢。
编辑2012年10月22日:我不相信@rmaddy给出的唯一答案完全适用于我的情况,但它仍然是一个很好的答案,所以我会接受它。我会密切关注这个问题,如果我发现任何新的东西,我会回来。谢谢。 J.Z。
答案 0 :(得分:6)
可能使用类似的东西:
[self performSelector:@selector(doSomething) withObject:nil afterDelay:0];
是在调用'doSomething'之前允许当前的runloop完成。换句话说,在调用'doSomething'之前,可以完成当前调用堆栈(当前方法返回)。通常这用于为UI提供更新的机会。
虽然没有更多的背景,但很难知道作者的真实意图,但这是一种常见的用途。