這裏的情景:開放異步Web請求處理時的UIViewController被彈出(AFNetworking)
-A的UIViewController(A)推到使用AFNetworking導航堆棧
-On viewDidLoad中的異步GET被稱爲(一singleton AFHTTPClient在應用程序中共享)來填充視圖上的各種用戶元素(比如UILabel)。
- 用戶按下後退按鈕請求返回
-assume其他活動視圖控制器可以發出請求,所以你不能取消所有打開的操作
所以問題#1,你應該跟蹤打開請求之前由UIViewController A創建,並在用戶離開視圖時取消未完成的視圖,或者讓他們完成並忽略它們?由於AFNetworking使用塊,正在更新的用戶元素將保留在塊內部,因此在彈出視圖後執行成功/失敗塊時不會導致崩潰。然而忽略它們的缺點似乎是不必要的網絡流量。
問題#2是,你會在哪裏執行代碼來取消UIViewController A所做的操作? viewDidDisappear看起來不正確,因爲用戶可能前進(將新視圖推入堆棧)而不是後退(彈出當前視圖),在這種情況下,您不想取消打開的請求,因爲用戶可能會回到當前視圖,並且不會再次加載。但是,我並不認爲dealloc或viewDidUnload將在請求執行時被調用,因爲該塊將保留用戶元素上的保留,所以我不認爲它可以去那裏。
對此會很感激。你認爲最佳做法是什麼?
附註:viewDidUnload與其視圖控制器的保留計數無關。它在視圖控制器想要擺脫其視圖時調用(並可能稍後重新加載它)。例如,當您收到內存警告時,會出現在選項卡或導航控制器中的任何離屏視圖控制器。所以它可以在你的請求正在進行時被調用。 – rickster 2012-04-12 03:47:31