Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/108.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.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 从核心数据获取大数据后的周期风险_Iphone_Ios_Core Data - Fatal编程技术网

Iphone 从核心数据获取大数据后的周期风险

Iphone 从核心数据获取大数据后的周期风险,iphone,ios,core-data,Iphone,Ios,Core Data,我正在我的一个应用程序中广泛使用核心数据。通常,对于UITableView,我使用NSFetchedResultsController。但是在一个特定的视图控制器中,我需要显示一些数据的总和——这需要我首先获取数据,然后进行for循环以分析数据并进行计算 然而,我认为,如果我获取大量数据(比如说,10.000个对象,每个对象包含一个NSString和一个float),并进行for循环,可能会导致我的应用程序崩溃。这是一个严重的风险吗?如果有,我怎么解决呢?(我想创建一个NSAutoRelease

我正在我的一个应用程序中广泛使用核心数据。通常,对于UITableView,我使用NSFetchedResultsController。但是在一个特定的视图控制器中,我需要显示一些数据的总和——这需要我首先获取数据,然后进行for循环以分析数据并进行计算


然而,我认为,如果我获取大量数据(比如说,10.000个对象,每个对象包含一个NSString和一个float),并进行for循环,可能会导致我的应用程序崩溃。这是一个严重的风险吗?如果有,我怎么解决呢?(我想创建一个NSAutoReleasePool,在计算后添加并释放每个对象,但我使用的是ARC,所以我认为我不能)。

我认为您应该对建议的循环满意


通过设置fetch请求的
batchSize
,可以指示核心数据始终只获取少量数据。然后,核心数据将执行增量抓取并为您管理内存。

在这样的循环中使用自动释放池

@autoreleasepool {
    // Insert code in here
}

此外,您应该确保在托管对象上下文中,
retainregisteredobjects
为否。此外,如果您真的开始使用太多,您可以通过使用
refreshObject:mergeChanges:

释放故障来手动控制故障,您不需要从核心数据实体获取所有属性来执行您尝试存档的复杂计算。只需在nsfetch请求上使用setPropertiesToFetch:即可,这将允许您仅获取所需的属性。另外,在获取请求中使用setBatchSize来告诉核心数据对对象进行故障处理,以保持低占用空间

显然,这取决于您的情况,但如果您需要某个属性的简单总和,您可能希望执行更具体的获取,如@PeterPajchl所述,谢谢您的回答,但计算并不简单=(附带说明,您仍然可以将AutoReleasePools与ARC一起使用,只是有点不同(搜索@autoreleasepool)哦,太好了!谢谢Kaan!这就是我写
的原因我想我不能
=)如果他想迭代10000个对象,你是怎么做到的@Mundi,即使是显示这一点的示例代码的链接也会引起兴趣。@DavidH,这很简单
for(fetchedResults中的id obj){}
。我的观点是,如果他一次读取这么多对象,由于没有中间自动释放池刷新,它可能会使用大量内存。重点是,他不会“一次读取这么多对象”。他有一个指向结果数组的指针,在迭代过程中,核心数据将获取它所需要的。我的观点是——他在获取过程中获取10000个项目,并检查每个对象,查看一个浮点和一个字符串。我的猜测是自动释放池将获得许多对象。他并不是在用谓词来寻找几个对象,这是完全不同的。