1

假设一条网络消息启动了一个回调方法。

- (void)didReceiveNetworkMessage {
  [obj respondToMethod];
}

- (void)myBigMethod {
  [obj mySmallMethod1];
  [obj mySmallMethod2];
  /* network message received now */
  [obj mySmallMethod3];
  [obj mySmallMethod4];
}

obj在单线程环境中调用的方法按什么顺序执行?

4

4 回答 4

2

假设以上所有内容都在主线程上,myBigMethod 将在处理 didReceiveNetworkMessage 方法之前完成执行(因此将调用 mySmallMethod4)。

回调通常在主线程上执行,因为它是在后台工作(即网络加载)完成后完成的。除非您专门对其进行了编码,否则一切通常都发生在主线程上。

于 2013-02-23T19:15:24.643 回答
1

更新:鉴于更新的问题,那么如果一切都在同一个线程上完成,那么respondToMethod将在myBigMethod完成后调用。

如果涉及多个线程,则假设在与方法didReceiveNetworkMessage不同的线程上调用myBigMethod,您将看到:

mySmallMethod1
mySmallMethod2
mySmallMethod3
mySmallMethod4

并且respondToMethod可以在mySmallMethod2开始执行时或之后的任何时间调用。

换句话说,respondToMethod可能与mySmallMethod2,mySmallMethod3mySmallMethod4什至在mySmallMethod4完成后同时运行。

于 2013-02-23T19:14:45.907 回答
0

不在同一个线程、同一个队列或以同一个队列为目标的队列上的方法相对于彼此具有未定义的顺序。每个指令的单独指令可以在另一个过程中的任何时间发生,包括同时发生。

如果这些方法在这样的序列化上下文中运行,那么排序取决于哪个先开始;但是,同样的问题也适用于启动该方法,因此该顺序也是未定义的。

于 2013-02-23T19:18:09.677 回答
-1

这取决于如何将所有内容推入堆栈。你最好的办法是观察你的堆栈(打印出消息)等等来弄清楚。堆定义了执行的顺序。如果延迟有问题,操纵堆顺序可能会为您解决它。如果你需要同时执行一些东西,多线程和在块代码中折腾应该会有所帮助。

- (void)didReceiveNetworkMessage {
  [obj respondToMethod];
}

- (void)myBigMethod {
  [obj mySmallMethod1];
  [obj mySmallMethod2];
  /* network message received now */
  [obj mySmallMethod3];
  [obj mySmallMethod4];
}

从上面提到的参考代码来看,respondToMethod, mySmallMethod1,2,3,4 似乎是按该顺序调用的。

我猜我必须在完全缺乏上面提供的信息的情况下澄清这一点(包括哪些消息实际上调用了这些方法以及在哪里调用)。没有这些信息,我的答案是正确的。不知道为什么我因此而被否决。我已经说明了调用和执行方法的顺序,假设您在 mySmallMethod3 之前和 mySmallMethod2 之后收到来自 respondToMethod 的回调。这就是上面例子中所说的。如果您希望获得更好的答案,请提供一个更好更清晰的示例。

于 2013-02-23T19:11:05.770 回答