Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用进度视图实现iOS下载管理器的最佳实践_Ios_Objective C_Download_Progress - Fatal编程技术网

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

使用进度视图实现iOS下载管理器的最佳实践,ios,objective-c,download,progress,Ios,Objective C,Download,Progress,我有一个显示音频文件列表的UITableViewController,当点击音频文件时,我按下另一个显示音频文件详细视图的UITableViewController。此视图还具有“下载”按钮和UIProgressIndicator视图 我有一个下载管理器类(作为单例实现),负责下载文件。它的下载方法使用一个块,该块通过下载进度的更新被调用。我用它来更新UIProgressIndicator视图。在您离开“局部视图”控制器并在稍后文件仍在下载时返回时,此操作可以正常工作。当然,前面指定的进度块仍然

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

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

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

有什么建议吗


谢谢

如果下载器的寿命由VC控制,则块方法非常有用。这样,当释放VC时,它会释放下载程序(下载程序不会是单例的)。 否则,您可能会创建无法释放的捕获对象(VC),因为它们在您的块中被引用,而您的块被“永恒”对象(singleton)引用

由于VC的寿命可能比下载程序短,因此更好的选择是使用一些基于订阅的下载程序单例

这样,VC在(例如)视图中的订阅将出现,而在视图中的取消订阅将消失(重要)

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


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

是的,VC的生命周期是最重要的部分。我经常通过下载程序代码发送通知来解决这个问题。它的性能好,易于实现,并提供了一个松散耦合的系统。此外,如果您想使用KVO+块,请检查块KVO感谢您的洞察力!我使用了KVO方法,它使代码更容易理解,更不容易出错。。。一旦我发现observeValueForKeyPath不一定在主线程上执行,我就不得不加入dispatch_async以避免更新进度指示器视图时崩溃。