实现带有进度视图的 iOS 下载管理器的最佳实践

Best practices for implementing an iOS download manager with progress view

我有一个显示音频文件列表的 UITableViewController,当我点击一个音频文件时,我会推送另一个显示音频文件详细视图的 UITableViewController。这个视图还有一个 "Download" 按钮和一个 UIProgressIndicator 视图。

我有一个下载管理器 class(作为单例实现)负责下载文件。它的下载方法采用一个块,该块被调用以更新有关下载进度。我用它来更新 UIProgressIndicator 视图。在您离开详细视图控制器并在文件仍在下载的稍后时间点返回之前,这工作正常。当然,前面指定的进度块仍然可用,但其中引用的UIProgressIndicator视图不可用,因此不再更新。

我想知道,在重新进入详细视图控制器 (viewDidLoad) 时重新设置块是否是一个明智的想法,或者基于块的方法是否真的不适合这种情况?也许使用 KVO 会更好?

有什么建议吗?

谢谢!

如果下载器的生命周期由 VC 控制,则块方法很有用。这样,当 VC 被释放时,它会释放下载器(下载器不会是单例)。 否则,您可能会创建无法释放的捕获对象(VC),因为它们在您的块中被引用,并且您的块被 "eternal" 对象(单例)引用。

由于 VC 生命周期可能比下载器短,更好的选择是使用一些基于订阅的下载器单例观察。

这样您的VC 订阅(例如)viewWillAppear 和取消订阅 viewWillDisappear(重要)。

您还可以使用全局进度通知(通过 NSNotificationCenter)、键值观察或任何其他方式。

重要的是,当您的 VC 发布时,下载器中没有任何内容指向它。