2009-12-23 48 views
1

我開始使用異步,但獲取返回的數據變成了一個麻煩。然後我開始使用類方法,我相信它排除了使用委託方法的可能性。所以我保持同步,知道這將是一個問題,但不認爲我會遇到這樣一個解決方案很難。在保持UI可交互的情況下檢索數據的最佳方式是什麼?iPhone上的同步NSURLConnection線程

回答

2

同步NSURLConnections在NSOperation內部工作得很好 - 因爲你正在同步使用它們,NSOperationQueue交給NSOperations會自動使用後臺線程來運行它們(否則你必須做額外的工作)。

讓URL連接在後臺線程中運行是保持UI響應的關鍵,這是異步NSURLOperation默認不會執行的操作(查看數據回調所在的線程)。

有時你想處理數據傳入(就像你有進度條一樣),在這種情況下異步URL連接更好,它們仍然可以在NSOperation中。因爲這讓你感到沮喪,所以你可能想看一下另一種基於NSOperation的ASIHTTPRequest庫,但它似乎可能會讓你感覺不那麼痛苦(它們有很好的示例代碼):

http://allseeing-i.com/ASIHTTPRequest/

2

NSURLConnection同步調用應該能夠卡在後臺線程中,但我強烈建議您處理'麻煩',並做到正確的方式。在保持UI交互的同時檢索數據的最佳方式是使用NSURLConnection的異步方法。

+0

我可能會錯誤地做後臺線程,因爲它似乎並沒有工作(不正確地做事的一個很好的跡象)。 我可能對「正確的方式」有錯誤的想法。一旦收到一些數據,它將用於另一種方法的調用。委託方法對此沒有幫助。 – woody993 2009-12-23 22:45:35

+0

當你得到你的第一個連接:didReceiveData時,你應該創建一個NSData對象,然後向它添加額外的數據。 – 2009-12-23 23:27:52

+0

@Ben我正在使用類方法,我的理解是,一個NSData對象是不可用的那種方式 – woody993 2009-12-24 04:44:13

1

出於興趣您在獲取數據時遇到了哪些問題?我發現使用異步NSURLConnection和NSNotificaion時,它已經完成是一個相當方便的解決方案。

在你需要數據的類(我通常把它放在init方法)

-(id)init{ 
    ... object setup ... 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateView) name:@"ScanCompleted" object:nil]; 
} 

的UpdateView是當連接已完成接收數據

在NSURLConnection的

要調用的方法

- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 

//Notify that we are finished 
[[NSNotificationCenter defaultCenter] postNotificationName:soapAction object:self]; 

} 

這對我很好用 - NSURLConnection是線程化的,因此UI不會鎖定,並在數據完成時得到更新downloadi NG。

+0

一旦收到數據它被用於後續的方法。 – woody993 2009-12-23 22:57:42

+0

@ woody993:那麼使用這些數據!追加到'didReceiveData:'中,然後在'didFinishLoading:'中使用完成的數據。您可以在那裏處理它或將其附加到通知或使用它分離新線程。 – benzado 2009-12-24 01:39:32

+0

@benzado它不只是單一步驟,後續方法然後將其數據發送到第三種方法 – woody993 2009-12-24 04:43:01