微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

objective-c – “performSelector:withObject:afterDelay:”之间的区别是什么,其中delay是0,只是调用选择器?

我正在开发一个使用第三方SDK的iPad项目,并且已经阅读了SDK代码以了解它和 objective-c.我在异步回调中遇到了以下行:
[self performSelector:@selector(doSomething) withObject:nil afterDelay:0];

我在那个选择器上阅读了the documentation.相关的行似乎如下:

Specifying a delay of 0 does not necessarily cause the selector to be performed immediately. The selector is still queued on the thread’s run loop and performed as soon as possible.

我无法确定为什么要编写[self performSelector:@selector(doSomething)withObject:nil afterDelay:0],而不是仅仅编写[self doSomething].在我看来,延迟为零意味着应该立即进行呼叫.显然我遗漏了一些东西,框架作者不太可能随意选择这种方法.其他StackOverflow答案也没有说明这一点.是否使用了“performSelector”选择器,因为doSomething选择器本身是异步的,并且调用是在异步回调中进行的?

我确实发现another link建议如下:

It’s interesting to note that using performSelector with afterDelay will also let the warning [viz,a compiler warning] go away: …

[self performSelector:aSelector withObject:nil afterDelay:0.0];

那么作者是否使用此代码仅抑制编译器警告?如果是这种情况,那么最好通过clang push / pops来抑制警告,如this thread所示.

如果有人有一个有说服力的解释为什么作者使用… afterDelay方法,我将不胜感激.谢谢.

编辑2012年10月22日:我不相信@rmaddy给出的唯一答案完全适用于我的情况,但它仍然是一个很好的答案,所以我会接受它.我会密切关注这个问题,如果我发现任何新的东西,我会回来.谢谢. J.Z.

解决方法

一种可能的用途:
[self performSelector:@selector(doSomething) withObject:nil afterDelay:0];

是在调用’doSomething’之前允许当前的runloop完成.换句话说,在调用’doSomething’之前,可以完成当前调用堆栈(当前方法返回).通常,这用于为UI提供更新的机会.

虽然没有更多的背景,但很难知道作者的真实意图,但这是一种常见的用法.

原文地址:https://www.jb51.cc/c/119737.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐