假设一条网络消息启动了一个回调方法。
- (void)didReceiveNetworkMessage {
[obj respondToMethod];
}
- (void)myBigMethod {
[obj mySmallMethod1];
[obj mySmallMethod2];
/* network message received now */
[obj mySmallMethod3];
[obj mySmallMethod4];
}
在obj
上调用的方法在单线程环境中执行的顺序是什么?
答案 0 :(得分:2)
假设上面的所有内容都在主线程上,myBigMethod将在处理didReceiveNetworkMessage方法之前完成执行(因此将调用mySmallMethod4)。
回调通常在主线程上执行,因为它是在后台工作(即网络加载)完成后完成的。除非你特别编写了它,否则一切都通常发生在主线程上。
答案 1 :(得分:1)
更新:鉴于已更新的问题,如果所有内容都在同一个主题上完成,则respondToMethod
完成后将调用myBigMethod
。
如果涉及多个线程,则假设didReceiveNetworkMessage
在与myBigMethod
方法不同的线程上调用,您将看到:
mySmallMethod1
mySmallMethod2
mySmallMethod3
mySmallMethod4
和respondToMethod
可以在mySmallMethod2
开始执行或以后执行时随时调用。
换句话说,respondToMethod
可能与mySmallMethod2
,mySmallMethod3
或mySmallMethod4
同时或甚至在mySmallMethod4
完成后运行。
答案 2 :(得分:0)
不在同一线程,相同队列或以同一队列为目标的队列的方法相对于彼此具有未定义的排序。每个人的个别指示可以在另一个时间内发生,包括同时发生。
如果方法正在这样的序列化上下文中运行,那么排序取决于首先启动的方法;同样的问题适用于启动方法,因此订单也是未定义的。
答案 3 :(得分:-1)
这取决于如何将所有内容推入堆栈堆中。你最好的选择是观察你的堆叠(打印出来的消息)等等。堆定义了执行的顺序。如果延迟有问题,操作堆顺序可能会为您解决。如果您需要同时执行某些操作,则多线程和在块代码中进行抛掷应该会有所帮助。
- (void)didReceiveNetworkMessage {
[obj respondToMethod];
}
- (void)myBigMethod {
[obj mySmallMethod1];
[obj mySmallMethod2];
/* network message received now */
[obj mySmallMethod3];
[obj mySmallMethod4];
}
从上面的代码中注明引用,似乎是responseToMethod,mySmallMethod1,2,3,4按顺序调用。
我猜我必须澄清一下,完全缺乏上面提供的信息(包括哪些消息实际上是在调用这些方法以及在哪里)。没有这些信息,我的答案就是正确的。不知道为什么我被投了票。我已经说明了调用方法的顺序,假设你在mySmallMethod3之前和mySmallMethod2之后收到来自respondToMethod的回调。这是上面例子中所说的。如果您希望获得更好的答案,请提供更明确的示例。