2013-08-28 18 views
1

我正在實施手動刷新。該刷新過程有3個步驟。每一個都需要在另一個之前完成(同步,串行等)。所有這些都需要在後臺完成,以免阻止用戶界面。刷新過程應該在後臺運行,但子處理需要同步

我已經單獨測試了3個方法,他們都做了他們應該做的事情(從服務器獲取數據,更新數據庫等),但是當我取消註釋並運行時,第二個在第一個完成之前就開始了。我無法弄清楚如何解決這個問題。我爲3種方法嘗試NSInvocationOperation並設置dependencies。沒有工作。試過queue.maxConcurrentOperationCount = 1。沒有工作。

第一種方法調用其他方法,並調用其他方法創建單獨的thread s,那麼這是問題嗎?當這種情況發生時,它是否認爲該操作已完成? NSOperation太複雜了嗎?有沒有更簡單的方法來說「做這件事,不做這件事直到完成」?

回答

3

使用NSOperationQueue和多個NSOperation實例,並指定它們之間的依賴關係是正確的方法。

如果操作創建其他線程並且不等待它們完成,那將會是一個問題,因爲操作會結束並且下一個操作將開始運行。

異步運行的操作應在NSOperation子類中執行。此子類需要從isConcurrent返回YES以便在開始/ main方法返回後使操作保持活動狀態。當isFinished更改爲YES時(該操作在KVO中觀察到,因此必須發送更改通知),操作完成。因此,異步過程需要在完成時更新併發布適當的通知。這將終止操作並允許下一個開始。

+0

感謝您的快速響應!我當然認爲依賴聽起來就像我想要的。我認爲我發現了一個可能的問題(很多是繼承代碼)操作調用的方法來啓動步驟1,然後有self.refreshOne = [[[RefreshOne alloc] initWithDelegate:self] autorelease];所以它只是創建一個自定義對象?問題是,在initWithDelegate中,它設置了一些變量,然後調用getData,然後「返回自我」。裏面的getData,包括使用ASIHTTP命中服務器。所以它回到初始化並返回自我,以便操作認爲它已完成。我需要自定義對象嗎? – skinsfan00atg

+0

啊,對,好吧。是的,我可能必須這樣做才能完成。又是什麼缺點? – skinsfan00atg

+0

我發現爲什麼事情在其他人結束之前就開始了,並且步驟1正確運行,修復後,你推薦使用NSOperation而不是調度串行隊列? – skinsfan00atg

相關問題