2013-11-15 88 views
-1

我有一種情況,可能是因爲在使用代表時缺乏對常規方法的理解而導致的。你能幫忙嗎?離開UIView時我應該殺死對等方法嗎?

請考慮我有一個叫做'homeViewController'的UIView。

此UIView實例化一個名爲'datastoreSync'的類,它是一個處理與遠程服務器同步後端的包裝類。我將UIView設置爲委託,並將數據存儲同步類分配給UIVIew中的變量。類datastoreSync依次依次觸發幾個類和方法,並將它們依次設置爲每個類的代理。所以... datastoreSync類將實例化'assetTree'並將自己設置爲委託。它等着'我完成了!'委派事件,然後轉到下一課。

assetTree類(以及所有其他小類)依次委託給處理通信的NSURLConnection對象。

現在,datastoreSync包裝類可能需要一些時間來完成它的工作,並且在運行時用戶可能會從我的UIView移動到另一個UIView。發生這種情況時,datastoreSync對象會保持活動狀態,因爲assetTree類正在完成它的工作。當assetTree類將自己設置爲NSURLConnection的委託並設置運行datastoreSync類的NSURLConnection超出範圍時。 assetTree類無法將委託事件重新提交給它,不幸的是,datastoreSync類中的靜態變量阻止其連續運行多次,因此無法重置,因此datastoreSync類會變得「鎖定」而無法再次運行。

我擔心我缺少一些基本的東西。如果用戶關閉設備,我需要datastoreSync類保持活動狀態,這樣他們才能啓動同步過程,然後鎖定設備,並很高興該更新會在後臺繼續進行,但我不知道我應該在什麼時候執行操作從一個UIView移動到另一個UIView。

當我離開視圖並編寫代碼以停止所有委託方法(如assetTree類)時,是否會發送datastoreSync類'kill'命令,實質上是放棄它的NSURLConnection響應?

我不確定如何正確處理此問題。我不害怕很多工作,我只是希望它是正確的請。

+1

當你說'UIView',你的意思是'UIViewController'?他們是非常不同的東西。 – Jim

+0

是的,我的意思是UIVIewController。謝謝你指出我的錯誤! –

回答

0

在離開UIView時,不要發送kill命令,而是在請求開始時添加邏輯以取消/清除之前UIView中鎖定您的datastoreSync的暫掛任務。這允許datastoreSync在後臺處理期間保持活動狀態,並且僅清除將在必要時阻止新請求的任務。

+0

我不確定這對於維護是否有好處,因爲我可能要去的每個頁面都必須知道上一頁開始的每個過程。我真的很感激你給我一個答案,所以請不要以爲我是忘恩負義。謝謝。 –

+0

你是對的:UIView對象應該不知道其他視圖。要做到這一點,您的datastoreSync類應該只關心與數據存儲同步。 –

+0

我明白你在說什麼,這是從另一方面接近問題,並取消之後的行動,而不是之前。這是最接近關於這個問題的答案,所以我將其標記爲答案。謝謝 –

0

我擔心我缺少一些根本性的東西。

是。

的UIView,稱爲'homeViewController'。

的UIView實例化一個(控制器類)

你不應該這樣做;請閱讀M-V-C。

瀏覽次數只能關注東西; 型號應該只關心存儲東西;啓動,停止和一般的作用控制東西屬於控制器

因此,您應該從應用程序委託(如果您在啓動時立即需要它)或從一個視圖控制器(作爲對用戶操作的響應)或從其他控制器實例化數據庫連接。

+0

你好,謝謝你的回覆。吉姆正確地拉住了我,並指出我的意思是UIViewController不UIView。對此感到抱歉。 –

+0

雖然可以在AppDelegate中建立數據庫連接,但我們關心的是通過web服務連接到遠程數據庫。我們正在討論的類處理iOS數據庫(代碼數據)和遠程數據庫(MS Sql服務器)之間的同步。 –