如何调用方法a.s.a.p.但最早在下一次运行循环迭代中?

时间:2011-08-17 16:22:38

标签: iphone ios ipad nsobject performselector

我需要一种保存方式来说:“iOS,我希望这个方法尽快执行,但不要在这个循环迭代中执行。最早在下一个,但请不要在这一个。谢谢。”< / p>

现在我总是这样做:

[self performSelector:@selector(doSomethingInNextRunLoop) withObject:nil afterDelay:0];
[self doSomeOtherThings];

假设将永远执行-doSomeOtherThings -doSomethingInNextRunLoop

文档说:

  

指定延迟0并不一定会导致选择器   马上执行。选择器仍然在线程上排队   运行循环并尽快执行。

所以基本上可能会立即调用该方法,就像我刚刚发送了一条直接消息一样,导致-doSomethingInNextRunLoop-doSomeOtherThings之前执行?

我怎样才能绝对确定它会被称为a.s.a.p.但是从来没有在同一个运行循环迭代中?

澄清措辞:对于运行循环,我指的是主线程,以及所有方法必须返回的迭代,直到线程为新事件再次准备好。

4 个答案:

答案 0 :(得分:9)

如果你担心苹果可能会在某一天特殊情况下延迟0,你可以随时指定延迟1e-37左右。尽管可以轻松读取performSelector:withObject:afterDelay:的文档,以确保选择器始终安排在下一次运行循环迭代中。

如果你担心Apple有一天特殊情况下的延迟会低于某个任意下限,你可以尝试使用NSRunLoop的performSelector:target:argument:order:modes:,文档明确指出这将为下一次运行循环迭代计划执行

答案 1 :(得分:6)

使用GCD(Grand Central Dispatch)非常简单:

dispatch_async (dispatch_get_main_queue (), ^{
    NSLog (@"This stuff runs in the next iteration of the main run loop");
});

答案 2 :(得分:1)

我认为你从阅读文档中得出的结论是错误的。

  

所以基本上可能会发生这个方法被立即调用,好像我刚刚发送了一条直接消息

没有。您引用的文档部分表示选择器始终在运行循环中排队,无论如何。所以它永远不会像直接消息那样被执行。

第一句“不一定”可能会有点误导,但我认为第二句应该真正澄清你所担心的不会发生。

答案 3 :(得分:0)

当然你只是这样做;

[self doSomeOtherThings];
[self performSelector:@selector(doSomethingInNextRunLoop) withObject:nil afterDelay:0];

这保证了您想要的执行顺序。