如何尽快调用一个方法,但最快在下一次运行循环迭代?

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

现在我总是这样做:

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

假设-doSomeOtherThings将始终执行一些其他-doSomethingInNextRunLoop

该文件说:

指定延迟0不一定会导致select器立即执行。 select器仍在线程的运行循环中排队,并尽快执行。

所以基本上可能会发生这样的情况:即时调用方法就好像我刚刚发送了一个直接的消息,导致-doSomethingInNextRunLoop在执行之前执行一些其他的-doSomeOtherThings

我怎样才能绝对确保它将被称为asap,但从来没有在这同样的运行循环迭代?

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

如果你担心苹果有一天会特殊延迟0,你总是可以指定延迟1e-37左右。 虽然performSelector:withObject:afterDelay:的文档可以很容易地读取,以保证select器总是被安排在下一次运行循环迭代中。

如果你担心苹果可能会有某天特殊的延迟小于某个任意的下限,那么你总是可以尝试使用NSRunLoop的performSelector:target:argument:order:modes:文档明确指出,它将为下一次迭代运行循环。

使用GCD(Grand Central Dispatch)非常微不足道:

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

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

所以基本上可能会发生这样的情况:即时调用该方法,就好像我刚刚发送了一条直接消息

不。您引用的文档部分说,select器总是在运行循环中排队,无论如何。 所以它永远不会被当作一个直接的信息来执行。

“不一定”的第一句话可能有些误导,但我认为第二句话应该说明你害怕的事情不是要发生的。

当然,你只是这样做;

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

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