我正在設計應用程序的階段,該應用程序將使用REST Web服務,並且在使用異步與同步與線程之間存在困難。這是場景。iPhone應用程序中的異步與同步與線程
假設您有三種深入的選擇,每種都有自己的基於REST的資源。我可以用同步請求延遲加載每個請求,但這會阻止用戶界面,並阻止用戶在檢索數據時碰到後退導航按鈕。這種情況幾乎適用於,除了,當你的應用程序需要登錄屏幕。由於這個原因,我看不出有任何理由使用同步HTTP請求。唯一有意義的是讓工作線程發出同步請求,並在請求完成時通知主線程。這將阻止該塊。接下來的問題就是在代碼中標記代碼,看看哪些代碼有更多開銷,線程同步請求或異步請求。
異步請求的問題是您需要設置智能通知或委託系統,因爲您可以在任何給定時間對多個資源發生多個請求。他們的另一個問題是如果我有一個類,比如說一個處理所有數據的單例,我不能在getter方法中使用異步請求。這意味着下面的不會去:
- (NSArray *)users {
if(users == nil)
users = do_async_request // NO GOOD
return users;
}
,而以下幾點:
- (NSArray *)users {
if(users == nil)
users == do_sync_request // OK.
return users;
}
您也可以享有優先權。我的意思是優先考慮的是,如果您查看iPhone上的Apple的Mail應用程序,您會注意到他們首先會刪除整個POP/IMAP樹,然後再次請求檢索郵件的前兩行(缺省值)。
我想我的問題給你的專家是這樣的。何時使用異步,同步,線程 - 以及何時在線程中使用異步/同步?當異步請求完成時,您已經設置了什麼樣的委派系統來知道該怎麼做?您是否優先處理異步請求?
對於這個太常見的問題,有一個解決方案的色域。破解一些東西很簡單。問題是,我不想破解,我想要一些簡單易維護的東西。
斯蒂芬,我認爲一個狀態機和隊列將幫助我噸。我假設你在任何地方都沒有例子? – Coocoo4Cocoa 2008-12-16 16:18:29
「狀態機」是對它進行表述的一種相當宏偉的方式......它是一些布爾和一些switch語句。沒有什麼非常聰明的,但我發現預先繪製在一張紙上是有用的。隊列只是一個NSMutableArray。 – 2008-12-16 22:46:14