2011-02-10 114 views
2

只是想弄清楚什麼是設計這種功能的最佳方式?基本上我發送一個異步的NSURLConnection,它會發送一個返回一堆數據的服務器。一旦我得到的數據,我必須執行一些工作,它是非常昂貴的,而我寧願做一個bg線程,以防止UI鎖定。最後,我還需要隨着從服務器收到並處理的響應動態地進行可用的更新。如何在更新UITableView時在後臺線程中執行網絡任務?

我的問題是我將如何去做後臺線程中的工作作爲數據到達,以便該表不會等待,直到所有的數據已被加載之前被更新??

這是我到目前爲止的僞碼。在我的ViewController中,我會有兩個BOOL標誌newDataReceived和dataFinishedDownloading。我也有兩個變量,一個包含當前數據的字符串和一個保存處理數據結果的nsarray。然後,

  1. in didReceiveResponse:我會通過調用performSelectorInBackground:用處理方法作爲選擇器來產生一個新的線程。
  2. 在這種方法中,我會有一個循環,首先會檢查newDataReceived以查看是否有新數據到達,如果有,請對其執行一些操作。
  3. 一旦處理完畢,我會接盤的結果的NSArray中,然後調用更新表格數據源,並重新加載使用performSelectorOnMainThread表的另一種方法:
  4. 最後我想檢查dataFinishedLoading標誌,以查看是否有任何數據處理
  5. 如果還有數據,並會從頭再來,否則清理線程退出

另外,newDataReceived標誌將在didReceiveData設置:以及接收到的實際數據。最後在didFinishLoading中,我會設置dataFinishedLoading標誌來表示所有數據都已加載。

我打算在檢查狀態標誌以及獲取和設置接收到的數據字符串和結果nsarray時在#2-4中使用NSLock。

我確定有很多方法可以做同樣的事情,但這似乎是一個好方法嗎?

THX

+0

任何人以相同或差異的方式做了類似的事情? – James 2011-02-10 21:40:28

回答

0

你要找做可以與performSelectorOn ...方法來實現。看看這個:http://arstechnica.com/civis/viewtopic.php?f=20&t=49035

請記住UI更新應該在主線程中完成(所以使用performSelectorOnMainThread進行UI更新)。

+0

嗨,thx的輸入,但我希望多一點。我熟悉上述的performSelectorOn方法,雖然不完全確定你的意思。 – James 2011-02-10 21:40:08

1

你可以看看NSOperation和NSOperationQueue。 NSOperation是在後臺進行繁重的計算和操作的理想選擇。如果你需要不斷更新tableview,你可以在你的Operation中實現一些協議來處理tableview的回調。

相關問題