2013-02-23 109 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

中的方法是不一樣的線程,同一個隊列,或針對同一隊列的隊列上有彼此相對不確定的排序。每個人的指示都可以在另一個人的任何時間進行,包括同時進行。

如果方法在那樣的序列化的上下文中運行,則排序是依賴於哪一個先開始;但同樣的問題適用於啓動方法,所以訂單也是未定義的。