2

这是场景:

我正在写一个DownloadManager,它允许用户下载、暂停、取消、全部下载和全部暂停。这DownloadManager是一个单例,AFNetworking用于下载文件。它有自己的私有托管对象上下文,因此用户可以自由地使用应用程序的其他部分(通过添加、编辑、删除)核心数据对象。我有一个 DownloadInfo存储下载信息的核心数据实体,即fileURLfileSizebytesRead等。DownloadManager更新下载进度DownloadInfo(每个文件一个)。

我有一个DownloadManagerViewController用于NSFetchedResultsController向用户显示下载状态的工具。此下载视图控制器正在使用主托管对象上下文。

现在假设我在下载队列中有 20 个文件。假设只允许 3 个并发下载。下载管理器应该下载文件,并显示下载进度。

问题:

DownloadInfo对象正在以非常高的DownloadManager速率更新。(DownloadManagerViewController负责显示下载进度)正在使用NSFetchedResultsControllerDelegate方法更新列表。结果是主队列中发生了很多事情,应用程序的响应能力很差。

我怎样才能解决这个问题?如何使应用程序响应,同时显示下载进度?

  1. 我不知道如何在DownloadManager和之间传达下载状态DownloadManagerViewController。还有另一种/更好的方法吗?

  2. DownloadManager由于上述原因,我不想在 my 中使用主托管对象上下文。请注意,DownloadManager正在使用AFNetworking异步处理请求,但最终DownloadInfo对象会在主线程中更新(作为回调方法的结果)。也许有一种方法可以在后台线程中处理下载和状态更新操作?但如何?我将如何在主线程和后台线程之间进行通信,即我将如何告诉后台线程排队另一个文件以供下载?

谢谢。

4

2 回答 2

0

您是否尝试过使用 Instruments 来查看 ViewController 中到底发生了什么?Time Profiler 将告诉您 CPU 在哪里花费了更多时间,并将帮助您确定问题的根源。如果不知道这一点,我们就无法确切知道您应该进行哪些性能调整。

使用 Instruments 后,如果NSFetchedResultsController你的 VC 强制更新很多,你应该考虑不要从 CoreData 读取进度。我已经看到我的很多表或视图花费更多时间从 CoreData 读取而不是执行绘图。猜测您的问题与 CoreData 读取有关,我会尝试从 an 读取进度,NSMutableDictionary并在下载通过某个阈值时更新 UI。

于 2013-07-12T17:04:52.567 回答
0

与其观察托管对象上下文的每一次更改,不如考虑为您实际想要更新屏幕的事件实现一个或多个通知。如果通知是从后台线程发布的,请确保在触发任何 UI 更新之前切换回主线程。

或者,当调用 FRC 委托方法时,您会收到有关实际更改内容的信息。您可以对此进行分析并过滤掉最频繁和最不重要的更改,并阻止它们导致 UI 更新。

于 2013-06-29T10:19:11.787 回答