【问题标题】:Best practices for implementing an iOS download manager with progress view使用进度视图实现 iOS 下载管理器的最佳实践
【发布时间】:2015-08-14 08:22:30
【问题描述】:

我有一个 UITableViewController 显示音频文件列表,当点击一个音频文件时,我推送另一个 UITableViewController 显示音频文件的详细视图。此视图还具有“下载”按钮和 UIProgressIndicator 视图。

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

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

有什么建议吗?

谢谢!

【问题讨论】:

    标签: ios objective-c download progress


    【解决方案1】:

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

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

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

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

    重要的是,当你的 VC 发布时,下载器中没有任何东西指向它。

    【讨论】:

    • 是的,VC 的生命周期是最重要的部分。我经常通过下载器代码发送的 NSNotifications 解决这个问题。它具有高性能且易于实现,并提供了一个松散耦合的系统。
    • 另外,如果你想使用 KVO+blocks,请查看 Block-KVO github.com/iMartinKiss/Block-KVO
    • 感谢您的洞察力!我采用了 KVO 方法,它使代码更容易理解并且更不容易出错......一旦我发现 observeValueForKeyPath 不一定在主线程上执行,我不得不抛出 dispatch_async 以避免崩溃时更新进度指示器视图。
    猜你喜欢
    • 2013-08-03
    • 1970-01-01
    • 2015-11-08
    • 1970-01-01
    • 1970-01-01
    • 2015-09-02
    • 2015-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多