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
Objective c setFetchBatchSize不';似乎工作不正常_Objective C_Ios_Core Data_Nsfetchrequest - Fatal编程技术网

Objective c setFetchBatchSize不';似乎工作不正常

Objective c setFetchBatchSize不';似乎工作不正常,objective-c,ios,core-data,nsfetchrequest,Objective C,Ios,Core Data,Nsfetchrequest,我问了一些关于这个话题的问题,但仍然无法让它发挥作用。我有一个核心数据,其中包含10k+行人名,我正在tableview中显示这些人名。我想能够搜索和更新每个字母表。它非常滞后。正如我建议的那样,我观看了WWWDC'10核心数据演示,并试图实现 [request setFetchBatchSize:50]; 似乎不起作用。当我使用仪器检查核心数据时,它仍然显示在加载tableview时仍然有10k请求,当我搜索时,它也会得到所有结果。 是否还有其他需要做的事情来设置批量大小,或者这对我没有帮助

我问了一些关于这个话题的问题,但仍然无法让它发挥作用。我有一个核心数据,其中包含10k+行人名,我正在tableview中显示这些人名。我想能够搜索和更新每个字母表。它非常滞后。正如我建议的那样,我观看了WWWDC'10核心数据演示,并试图实现

[request setFetchBatchSize:50];
似乎不起作用。当我使用仪器检查核心数据时,它仍然显示在加载tableview时仍然有10k请求,当我搜索时,它也会得到所有结果。 是否还有其他需要做的事情来设置批量大小,或者这对我没有帮助

唯一有效的方法是在搜索时将fetchlimit设置为100。你认为这是个好办法吗


提前谢谢

批大小只是告诉它一次要获取多少对象。这可能对你帮助不大。让我们考虑一下你的用例…

用户输入“F”,您告诉数据库,“查找所有以“F”开头的名称”,数据库将查看所有10k+记录,以查找以“F”开头的记录

然后,用户输入'r',因此您告诉数据库查找所有以“Fr”开头的记录,然后它再次查看所有10k+记录以查找以“Fr”开头的记录

fetchBatchSize所做的只是告诉它“嘿,当你在一个记录中出错时,一次输入50个,因为我可能需要所有这些。”这不会限制你的搜索

但是,将fetchLimit设置为100会有所帮助,因为数据库开始搜索所有10k+记录,但一旦有了100条记录,就不必继续查看其余记录,因为它已经完成了请求。它完成了,并在获得100条满足请求的记录时停止搜索

因此,您可以做一些事情,所有这些都取决于您的其他用例

最简单的尝试是在正在搜索的字段上添加索引。您可以在Xcode模型编辑器中进行设置(该部分称为索引,就在inspector中命名实体的地方)。这将允许数据库在该字段上设置一个特殊索引,搜索速度将大大加快

其次,在初始请求之后,您已经有了一个以“F”开头的名称数组,因此无需返回数据库请求以“Fr”开头的名称,如果名称以“Fr”开头,它也以“F”开头,并且您已经有了所有这些名称的NSManagedObject指针。现在,您只需搜索返回的数组

更好的是,如果您给它一个排序描述符,数组就被排序了。因此,可以对数组执行简单的二进制搜索。或者,如果愿意,可以使用相同的谓词,将其应用于结果数组而不是数据库

即使您不使用我刚才讨论的结果修剪,我认为索引属性也会带来显著的效果

编辑

也许你应该运行仪器,看看你在哪里花了多少时间。此外,格式错误的谓词可能会导致任何索引方案失效。代码会有帮助

最后,考虑你把多少元素放入内存中。CoreData不会对中的所有信息出错,但它会为数组中的所有内容创建外壳

如果给它一个排序谓词

我不知道SQLLite是如何在索引上实现搜索的,但是B树具有复杂度logBN,所以即使在30k记录上,也不需要太多搜索。除非您还有其他问题,否则索引应该会给您带来相当大的改进

一旦有了索引,就不应该检查所有记录。但是,您可能仍然拥有一组非常大的数据。在这些上尝试fetchBatchSize,因为它将限制获取的记录数,并为其余记录创建代理

您还可以调用countFetchRequext而不是executeFetchRequest来获取项目数。然后,您可以使用fetchLimit来限制获得的数量

至于使用“获取结果”控制器处理所有这些问题。。。好吧,那家伙必须知道记录,所以它还必须进行搜索

还有一个地方可以看。。。你在做分区吗?如果您有一个用户定义的比较器用于任何事情(比如翻译部分),那么每个记录都会调用这个比较器

因此,我想我的大建议是,在改变指数后,运行工具并真正研究它,以确定你在哪里花费时间。这应该很明显。这将有助于引导你走向真正的问题


我敢打赌,出于某种原因,您仍在访问所有元素…

您是否将请求与NSFetchedResultsController一起使用?是的。我正在使用斯坦福CS193P类的fetchedresultscontroller。我喜欢使用谓词搜索已经获取的初始搜索结果的建议。这里有一个用法示例:非常感谢您详细的回复!我确实检查了使用搜索的一个字段的索引。这有点帮助,但仍然很慢。我也尝试在30k+的数据库上这样做。我将所有不用于其他表的字段移出,以便以后查询。唯一的问题是我没有将结果存储在数组中,我只是用fetchcontroller更新tableview。如果在数组中存储20k条记录,是否会出现内存不足的问题?是否有一种方法可以在不返回数据库或以某种方式更改谓词的情况下搜索fetchcontroller?我想知道你是否有3万首以上的歌曲,iphone搜索它们的速度有多快