2013-02-23 56 views
1

假设网络消息启动了回调方法。执行异步回调方法的顺序一个线程

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

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

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

+0

是否myBigMethod和didReceiveNetworkMessage被称为在同一个线程? – 2013-02-23 19:14:35

回答

2

以上假设一切是主线程上处理的didReceiveNetworkMessage方法之前,将myBigMethod完成执行(以便mySmallMethod4将被调用)。

回调函数在主线程通常执行,因为它是后后台工作(即网络负载)来完成就完成了。除非你已经专门编码,否则通常都会在主线程中发生。

-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的回调。这就是上面例子中所说的。如果你希望得到更好的答案,请提供一个更清晰的例子。

1

更新:由于更新的问题,那么,如果一切都在同一个线程,然后myBigMethod完成后respondToMethod将被要求完成。

如果多个线程参与再假设didReceiveNetworkMessage被称为在不同的线程比myBigMethod方法,你会看到:

mySmallMethod1 
mySmallMethod2 
mySmallMethod3 
mySmallMethod4 

respondToMethod可以在任何时间或调用而mySmallMethod2时开始执行后。

换句话说,respondToMethod可以同时作为mySmallMethod2mySmallMethod3,或mySmallMethod4甚至mySmallMethod4完成之后运行。

+0

我喜欢我们用“假设...”打开但做出了不同的假设! – jrturton 2013-02-23 19:16:37

+1

@ jrturton只有两个假设。我们每个人都拿一个。虽然我现在覆盖了两个。 :) – rmaddy 2013-02-23 19:17:35

0

中的方法是不一样的线程,同一个队列,或针对同一队列的队列上有彼此相对不确定的排序。每个人的指示都可以在另一个人的任何时间进行,包括同时进行。

如果方法在那样的序列化的上下文中运行,则排序是依赖于哪一个先开始;但同样的问题适用于启动方法,所以订单也是未定义的。