2015-08-14 36 views
2

我有一個顯示音頻文件列表的UITableViewController,當點擊一個音頻文件時,我推着顯示音頻文件詳細視圖的另一個UITableViewController。該視圖還具有「下載」按鈕和UIProgressIndicator視圖。實現帶有進度視圖的iOS下載管理器的最佳實踐

我有一個下載管理器類(實施爲一個單身),負責下載文件。它的下載方法需要一個被更新下載進度的塊。我正在使用它來更新UIProgressIndicator視圖。這可以正常工作,直到你離開細節視圖控制器,並在文件仍在下載的時候再回來。當然,前面指定的進度塊仍然可用,但其中引用的UIProgressIndicator視圖不是,因此不再更新。

我想知道,如果重新進入詳細視圖控制器(viewDidLoad)時重新設置塊或者如果基於塊的方法不適合這種情況是明智的想法?也許使用KVO會更好?

有什麼建議嗎?

謝謝!

回答

3

如果下載器的生命週期由VC控制,則塊方法非常有用。這樣,當VC被釋放時,它釋放下載器(下載器不會是單身)。 如果沒有,您可能會冒險創建無法釋放的捕獲對象(VC),因爲它們在您的塊中被引用,並且您的塊被「永恆」對象(單例)引用。

由於VC生命週期可能比下載器短,因此更好的選擇是使用一些基於訂閱的觀察下載器單例。

這樣你的VC訂閱(例如)viewWillAppear和取消訂閱在viewWillDisappear(重要)。

您還可以使用全局進度通知(通過NSNotificationCenter),鍵值觀察或任何其他方式。

重要的部分是,當你的VC被釋放時,下載器中沒有任何東西指向它。

+1

是的,VC的壽命是最重要的部分。我經常通過下載器代碼發送NSNotifications來解決這個問題。它的性能和易於實現,並提供一個鬆散耦合的系統。 – Tobias

+0

此外,如果您想使用KVO +塊,請選擇Block-KVO https://github.com/iMartinKiss/Block-KVO –

+0

感謝您的洞察!我使用了KVO方法,它使代碼更容易理解,並且不易出錯......一旦我發現observeValueForKeyPath不一定在主線程上執行,並且必須拋出dispatch_async以避免崩潰時更新進度指示器視圖。 –