2011-05-19 56 views
1

我有一個NSOperation不在主線程中運行。它是從UITableViewController派生的。當操作完成後,我想重新加載tableview,因爲有些數據已經改變。我已經爲背景設置了一個委託來完成通知。完成後,我使用performSelectorOnMainThread專門在主線程上調用reloadData的包裝器。NSOperation在後臺完成,試圖通知主線程,視圖不再存在。崩潰

大部分情況下,這個效果很好,但是,原始(編輯)tableViewController(/編輯)獲得釋放並獲得殭屍呼叫的機會非0。

所以,問題是兩個部分:

  1. 是否有可能有從後臺線程的委託,不保留的對象?
  2. 這只是一個糟糕的設計?我應該使用NSNotifications嗎?這是否是在這種情況下通知的首選方法?

在此先感謝。

+1

真正的問題是:爲什麼你的表格視圖被釋放?我有一種感覺,表視圖沒有妥善保留,這是你的根本問題。 – 2011-05-19 04:10:43

+0

John是對的,如果你需要重新加載它,你不應該釋放tableView。 reloadData方法將重置tableView,這就是你想要的。如果你想隱藏它或只是使用tableView.hidden屬性。 – 2011-05-19 05:35:10

+0

更正後,如果從導航控制器堆棧彈出,則可以釋放tableViewController。數據仍然可能是相關的,但我希望線程完成(並保存它正在處理的數據) – 2011-05-19 18:24:43

回答

1

如果在對代理的任何操作被調用之前有可能釋放它,那麼應該保留一個委託。您可以在tableViewController中設置一個狀態來處理委託回調被調用並且不使用tableViewController的情況(基本上使回調作爲非操作)。一旦你的操作完成,只需釋放委託對象。

這不是一個糟糕的設計,但你只需要處理這些條件。

+0

有趣。那麼,因爲通常在響應返回後發生的唯一情況是tableview重新加載,即使它沒有顯示,我也可以讓tableview重新加載,因爲委託保留它,它不會消失, t崩潰。我剛剛實現了這一點(通過改變分配以在必要時保留和釋放),並且在我們說話時進行測試。 – 2011-05-20 03:52:12