我有一个显示音频文件列表的UITableViewController,当点击音频文件时,我按下另一个UITableViewController,显示音频文件的详细视图。此视图还具有“下载”按钮和UIProgressIndicator视图。
我有一个Download Manager类(作为Singleton实现),它负责下载文件。它的下载方法采用一个块,该块被调用有关下载进度的更新。我正在使用它来更新UIProgressIndicator视图。这可以正常工作,直到您离开详细视图控制器,并在文件仍在下载的稍后时间返回。当然,前面指定的进度块仍然可用,但其中引用的UIProgressIndicator视图不是,因此它不再更新。
我想知道,如果在重新进入详细视图控制器(viewDidLoad)时重新设置块或者基于块的方法不适合这种情况是一个明智的想法吗?也许用KVO会更好吗?
有什么建议吗?
谢谢!
答案 0 :(得分:3)
如果下载程序的生命周期由VC控制,则块方法很有用。这样,当VC被释放时,它会释放下载器(下载器不会是单例)。 如果不是,您冒着创建捕获的对象(VC)的风险,因为它们在块中被引用而无法释放,并且您的块被一个永久的"对象(单身人士)。
由于VC的生命周期可能比下载器短,因此更好的选择是使用一些基于订阅的观察下载器单例。
这样你的VC就会在viewWillDisappear(重要)中订阅(例如)viewWillAppear和取消订阅。
您还可以使用全局进度通知(通过NSNotificationCenter),键值观察或任何其他方式。
重要的是,当你的VC被释放时,下载器中没有任何东西指向它。