我需要一种保存方式来说:“iOS,我希望这个方法尽快执行,但不要在这个循环迭代中执行。最早在下一个,但请不要在这一个。谢谢。”< / p>
现在我总是这样做:
[self performSelector:@selector(doSomethingInNextRunLoop) withObject:nil afterDelay:0];
[self doSomeOtherThings];
假设将永远执行-doSomeOtherThings
-doSomethingInNextRunLoop
。
文档说:
指定延迟0并不一定会导致选择器 马上执行。选择器仍然在线程上排队 运行循环并尽快执行。
所以基本上可能会立即调用该方法,就像我刚刚发送了一条直接消息一样,导致-doSomethingInNextRunLoop
在-doSomeOtherThings
之前执行?
我怎样才能绝对确定它会被称为a.s.a.p.但是从来没有在同一个运行循环迭代中?
澄清措辞:对于运行循环,我指的是主线程,以及所有方法必须返回的迭代,直到线程为新事件再次准备好。
答案 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];
这保证了您想要的执行顺序。