Ios 核心数据&x2B;AFX2B;用户界面更新(响应性)
以下是场景: 我正在编写一个Ios 核心数据&x2B;AFX2B;用户界面更新(响应性),ios,core-data,afnetworking,download-manager,Ios,Core Data,Afnetworking,Download Manager,以下是场景: 我正在编写一个DownloadManager,它允许用户下载、暂停、取消、全部下载和全部暂停。DownloadManager是一个单例,它使用AFNetworking下载文件。它有自己的私有托管对象上下文,因此用户可以自由使用应用程序的其他部分(通过添加、编辑、删除)核心数据对象。我有一个存储下载信息的核心数据实体DownloadInfo,即fileURL,fileSize,bytesRead,等等。DownloadInfo管理器更新DownloadInfo中的下载进度(每个文件一
DownloadManager
,它允许用户下载、暂停、取消、全部下载和全部暂停。DownloadManager
是一个单例,它使用AFNetworking
下载文件。它有自己的私有托管对象上下文,因此用户可以自由使用应用程序的其他部分(通过添加、编辑、删除)核心数据对象。我有一个存储下载信息的核心数据实体DownloadInfo
,即fileURL
,fileSize
,bytesRead
,等等。DownloadInfo
管理器更新DownloadInfo
中的下载进度(每个文件一个)
我有一个DownloadManagerViewController
,它使用nsfetchedresultscoontroller
向用户显示下载状态。此下载视图控制器正在使用主托管对象上下文
现在假设我在下载队列中有20个文件。假设只允许3次并发下载。下载管理器应该下载文件,并显示下载进度
问题:
DownloadInfo
对象正在由DownloadManager
以非常高的速率更新。DownloadManagerViewController
(负责显示下载进度)正在使用NSFetchedResultsControllerDelegate
方法更新列表。结果是在主队列中发生了很多事情,并且应用程序的响应性非常差
我怎样才能解决这个问题?在显示下载进度的同时,如何使应用程序具有响应性
DownloadManager
和DownloadManagerViewController
之间传递下载状态。有没有其他更好的方法下载管理器中使用主托管对象上下文。请注意,DownloadManager
正在使用AFNetworking
异步处理请求,但最终会在主线程中更新downloadminfo
对象(这是回调方法的结果)。也许有办法在后台线程中处理下载和状态更新操作?但是怎么做呢?我将如何在主线程和后台线程之间进行通信,即如何告诉后台线程将另一个文件排队下载
谢谢。< /P> < P>而不是观察托管对象上下文的每一个更改,考虑为实际要更新屏幕的事件实现一个或多个通知。如果通知是从后台线程发布的,请确保在触发任何UI更新之前切换回主线程
或者,当调用FRC委托方法时,您将收到有关实际更改内容的信息。您可以对此进行分析,过滤掉最频繁和最没有意义的更改,并防止它们导致UI更新。您是否尝试过使用工具查看ViewController中的实际情况?时间分析器将告诉您CPU在哪里花费了更多的时间,并将帮助您确定问题的根源。如果不知道这一点,我们就无法确切地知道您应该做哪些性能调整
使用工具后,如果<代码> NSFetchedResultsController 强迫你对VC进行大量更新,你应该考虑不要阅读CordaDa的进度。我已经看到,我的许多表或视图从CoreData读取数据的时间比执行绘图的时间要多。猜测您的问题在于CoreData读取,我会尝试从
NSMutableDictionary
读取进度,并在下载超过某个阈值时更新UI。什么更新信息应该真正出现在屏幕上,何时出现?下载进度(即下载的y中的x)以及文件名——基本上。文件的大小可以从几KBs到几MBs不等,因此每次添加新文件、文件下载完成、文件下载开始(从队列中)以及大约每秒更新时,屏幕都应该刷新。我可以不显示最新的下载状态,即每3-5秒更新一次屏幕,以显示下载进度。