我的应用显示了一张带有核心数据提取注释的地图。目前我在viewDidLoad中为地图做performFetch
,但是,当我在tabViewController中选择其选项卡时,这会延迟地图立即出现在屏幕上。是否有更合适的地方可以致电performFetch
或者还有别的我做错了吗?它从Core Data返回大约250个对象。
由于
答案 0 :(得分:2)
除了/代替运行线程,您可以将获取限制为小批量,例如10个对象。然后获取10个对象,显示它们,然后获取下一个10,依此类推。这将使您的界面保持活跃,并且用户将理解他们正在观看渐进过程。
使用-[NSFetchRequest setFetchLimit:]
限制每次提取返回的对象数,并-[NSFetchRequest setFetchOffset:]
为后续提取编制索引。
来自fetchOffset上的Apple文档:
默认值为0.
此设置允许您指定 行将开始的偏移量 回。有效地,请求 将跳过指定的数量 匹配条目。例如,给定一个 获取通常会返回的, b,c,d,指定偏移量为1 将返回b,c,d和偏移量 4将返回一个空数组。偏置 在嵌套请求中被忽略,例如 子查询。
这可以用来限制 工作数据集。结合 使用-fetchLimit,您可以创建一个 任意结果集的子范围。
您可能还想查看Core Data对象图设计。 250个对象不是很多,并且不应该有很多对象处理显着的性能。您可能需要将大量数据塞入一个实体,因此您必须在许多不需要的数据中出错才能获得一些相对微不足道的信息。
例如,常见的错误是将具有大量数据的属性(例如图像)添加到常用的实体(例如Person实体)。这会导致问题,因为要获取Person.name属性,您还必须加载数百kb的图像。
更好的设计是将大型属性存储在自己的实体中,并将其作为关系链接到其他实体。这样,只有在显式调用关系时,大数据块才会出现故障。在上面的示例中,您将把图像放在它自己的实体中。这样,当你想要Person.name时,你只需要轻量级文本中的错误。
答案 1 :(得分:1)
还有其他地方,例如viewDidAppear:
,但如果您运行长查询,它们也会锁定用户界面。
您可以做的一件事是在后台线程上执行fetch,然后让视图控制器在主线程上显示数据。