Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.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 核心数据&x2B;AFX2B;用户界面更新(响应性)_Ios_Core Data_Afnetworking_Download Manager - Fatal编程技术网

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秒更新一次屏幕,以显示下载进度。