Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/42.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
Iphone 在没有UITableView的情况下使用NSFetchedResultsController_Iphone_Core Data - Fatal编程技术网

Iphone 在没有UITableView的情况下使用NSFetchedResultsController

Iphone 在没有UITableView的情况下使用NSFetchedResultsController,iphone,core-data,Iphone,Core Data,纯粹为了数据管理而使用NSFetchedResultsController,即不使用它来提供UITableView,这是错误的吗 我在一个核心数据iPhone应用程序中有一对多的关系。每当该关系中的数据发生变化时,我需要执行一个计算,该计算要求对该数据进行排序。在苹果的标准部门/员工示例中,这类似于确定给定部门的工资中位数。无论何时员工被添加到该部门或从该部门中删除,或员工的工资发生变化,都需要再次执行中值计算 保持数据排序和最新,并在数据更改时获取通知,这对于NSFetchedResultsC

纯粹为了数据管理而使用
NSFetchedResultsController
,即不使用它来提供
UITableView
,这是错误的吗

我在一个核心数据iPhone应用程序中有一对多的关系。每当该关系中的数据发生变化时,我需要执行一个计算,该计算要求对该数据进行排序。在苹果的标准部门/员工示例中,这类似于确定给定部门的工资中位数。无论何时员工被添加到该部门或从该部门中删除,或员工的工资发生变化,都需要再次执行中值计算

保持数据排序和最新,并在数据更改时获取通知,这对于
NSFetchedResultsController
来说是一项很好的工作。唯一的“问题”是我没有使用
UITableView
。换句话说,我没有在
UITableView
中显示已排序的员工。我只需要一个最新的员工排序数组,这样我就可以在幕后分析他们。(当然,我不想编写大量重复
NSFetchedResultsController
的代码)


纯粹为了数据管理而使用
NSFetchedResultsController
,即不使用它为
UITableView
提供数据,这是一个坏主意吗?我在任何地方都没有看到这样做,我想我可能遗漏了什么。

在没有视图的情况下使用
NSFetchedResultsController
没有任何问题。您的用例听起来像是一个不重新发明轮子的好理由。

对我来说,这听起来像是NSFetchedResultController的适当使用。这可能有点过火,因为它的主要用途是帮助填充和保持最新的表视图,但如果您愿意忍受增加的复杂性,就没有理由不这样使用它。正确使用通知是另一种方法,它和我估计的一样复杂。

我不会说它不好,但肯定是“沉重的”

通过
NSManagedObjectContextDidSaveNotification
监视保存并在那里进行计算将减少内存和CPU。通知将在其
userInfo
中附带三个
NSArray
实例,然后您可以对这些数组使用一个简单的
NSPredicate
,查看您关心的任何员工是否已更改并作出响应

这是
NSFetchedResultsController
在封面下所做的工作的一部分。但是,您将避免使用
NSFetchedResultsController
中您不关心或不需要的其他部分

沉重的
NSFetchedResultsController
进行的处理比监视保存的对象更多。它处理三角洲,给它的代表打电话等等。我不是说它在任何方面都不好。我想说的是,如果你只关心对象在你的关系中什么时候发生了变化,你可以很容易地通过观察通知来做到这一点

记忆
此外,没有理由保留任何内容,因为您已经持有“部门”实体,因此可以访问其关系。保留子对象“以防万一”是对内存的浪费。让核心数据管理内存,这是使用它的部分原因。

感谢您的快速回答和建议!如果使用NSFetchedResultsController还不错,那么这听起来像是性能问题。在某些情况下,为其他需要排序的用户启动的计算保留排序后的数据对我很有用。我假设FetchedObject是大部分内存负担的来源。如果是这样,我将在处理保存通知时保留已排序的数据,从而丢失所节省的内存。但您所指的额外CPU使用量是多少?这是因为在NSFetchedResultsController中使用fetch而不是关系访问器造成的吗?您可以使用fetches根据属性查找对象。要查找关系,可以通过调用获取对象的关系来遍历对象图。遍历图形更有效,因为上下文只需要错误(即没有加载属性数据的对象)来遵循关系。我保留排序后的“Employee”的唯一原因目标是避免在每个用户发起的计算中使用它们。在这种情况下,我个人会创建一个方便的方法,返回已排序的员工,而不是保留他们,但这可以说是个人偏好。我喜欢这种方法;这就是我目前正在做的事情。:)实际上,我先过滤“员工”然后对结果进行排序。过滤后的数据集可能相对较小。所以我想:“一次对大数据集进行筛选/排序并缓存小的结果数组可能比每次需要排序的子集时重复筛选大数据集更聪明吗?我可以创建一个类来管理过滤/排序的数据,并使用来自MOC的更改通知来保持所有内容都是最新的。隐马尔可夫模型。。。因此,我的问题就诞生了。如下所述,以这种方式使用获取结果控制器不是问题。您应该记住“过早优化是万恶之源”。“因为这是最容易实现的方法,所以您可以尝试一下,看看它在这个特定的实例中是否有效,然后只有在您进行了测试并发现不足时才尝试其他方法。很难反驳@TechZen的建议。我对核心数据的掌握如此之多,以至于我倾向于以不同的方式看待它的内部结构。据我所知,共识是,从设计的角度来看,这不是一个坏主意,但它可能具有性能影响,最好通过测试进行评估。我希望我能接受所有的答案。