这是场景:
我正在写一个DownloadManager
,它允许用户下载、暂停、取消、全部下载和全部暂停。这DownloadManager
是一个单例,AFNetworking
用于下载文件。它有自己的私有托管对象上下文,因此用户可以自由地使用应用程序的其他部分(通过添加、编辑、删除)核心数据对象。我有一个 DownloadInfo
存储下载信息的核心数据实体,即fileURL
、fileSize
、bytesRead
等。DownloadManager
更新下载进度DownloadInfo
(每个文件一个)。
我有一个DownloadManagerViewController
用于NSFetchedResultsController
向用户显示下载状态的工具。此下载视图控制器正在使用主托管对象上下文。
现在假设我在下载队列中有 20 个文件。假设只允许 3 个并发下载。下载管理器应该下载文件,并显示下载进度。
问题:
DownloadInfo
对象正在以非常高的DownloadManager
速率更新。(DownloadManagerViewController
负责显示下载进度)正在使用NSFetchedResultsControllerDelegate
方法更新列表。结果是主队列中发生了很多事情,应用程序的响应能力很差。
我怎样才能解决这个问题?如何使应用程序响应,同时显示下载进度?
我不知道如何在
DownloadManager
和之间传达下载状态DownloadManagerViewController
。还有另一种/更好的方法吗?DownloadManager
由于上述原因,我不想在 my 中使用主托管对象上下文。请注意,DownloadManager
正在使用AFNetworking
异步处理请求,但最终DownloadInfo
对象会在主线程中更新(作为回调方法的结果)。也许有一种方法可以在后台线程中处理下载和状态更新操作?但如何?我将如何在主线程和后台线程之间进行通信,即我将如何告诉后台线程排队另一个文件以供下载?
谢谢。