如何尽快调用一个方法,但最快在下一次运行循环迭代?
我需要一个保存的方式来说:“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];
这保证了你想要的执行顺序。