ios - `relationshipKeyPathsForPrefetching` 不起作用
问题描述
我想在 UITableView 中显示来自核心数据的实体列表。在表格的每个单元格中,我想显示来自实体的信息,以及来自实体关系实体的附加信息。
这是一个问题,因为在滚动 UITableView CoreDate 期间,一个一个地询问实体的关系。
CoreData: annotation: fault fulfilled from database for : 0x925e06e26f1f7feb <x-coredata://D99D4673-2788-4E00-90D6-811007DDF5AA/AnimalActivitySettingBase/p23121>
CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZACTIVITYTAGID, t0.ZACTIVITYTAGSTATUS t0 WHERE t0.Z_PK = ?
CoreData: annotation: sql connection fetch time: 0.0002s
CoreData: annotation: total fetch execution time: 0.0003s for 1 rows.
CoreData: annotation: fault fulfilled from database for : 0x925e06e240bb7feb <x-coredata://D99D4673-2788-4E00-90D6-811007DDF5AA/AnimalActivitySettingBase/p20920>
CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZACTIVITYTAGID, t0.ZACTIVITYTAGSTATUS t0 WHERE t0.Z_PK = ?
CoreData: annotation: sql connection fetch time: 0.0002s
CoreData: annotation: total fetch execution time: 0.0003s for 1 rows.
CoreData: annotation: fault fulfilled from database for : 0x925e06e287177feb <x-coredata://D99D4673-2788-4E00-90D6-811007DDF5AA/AnimalActivitySettingBase/p24659>
CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZACTIVITYTAGID, t0.ZACTIVITYTAGSTATUS t0 WHERE t0.Z_PK = ?
CoreData: annotation: sql connection fetch time: 0.0002s
CoreData: annotation: total fetch execution time: 0.0003s for 1 rows.
CoreData: annotation: fault fulfilled from database for : 0x925e06e2ce6b7feb <x-coredata://D99D4673-2788-4E00-90D6-811007DDF5AA/AnimalActivitySettingBase/p29196>
CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZACTIVITYTAGID, t0.ZACTIVITYTAGSTATUS t0 WHERE t0.Z_PK = ?
CoreData: annotation: sql connection fetch time: 0.0002s
CoreData: annotation: total fetch execution time: 0.0004s for 1 rows.
CoreData: annotation: fault fulfilled from database for : 0x925e06e281bf7feb <x-coredata://D99D4673-2788-4E00-90D6-811007DDF5AA/AnimalActivitySettingBase/p25081>
CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZACTIVITYTAGID, t0.ZACTIVITYTAGSTATUS t0 WHERE t0.Z_PK = ?
CoreData: annotation: sql connection fetch time: 0.0003s
我检查了文档链接,发现了“预取”技术。听起来很棒。
我在代码中使用了它:
let fetchRequest = Animal.fetchRequest()
fetchRequest.predicate = predicate
fetchRequest.sortDescriptors = sortDesc
fetchRequest.relationshipKeyPathsForPrefetching = ["animalActivitySettingBase"]
我再次检查了日志:
CoreData: annotation: sql connection fetch time: 0.1825s
CoreData: annotation: total fetch execution time: 0.1862s for 10437 rows.
CoreData: annotation: Prefetching with key 'animalActivitySettingBase'. Got 10437 rows.
CoreData: annotation: total fetch execution time: 0.5184s for 11031 rows.
那太棒了。关系已预取。但...
当我向下滚动 UITableView 时,CoreData 再次询问:
CoreData: annotation: fault fulfilled from database for : 0x925e06e26f1f7feb <x-coredata://D99D4673-2788-4E00-90D6-811007DDF5AA/AnimalActivitySettingBase/p23121>
CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZACTIVITYTAGID, t0.ZACTIVITYTAGSTATUS t0 WHERE t0.Z_PK = ?
CoreData: annotation: sql connection fetch time: 0.0002s
CoreData: annotation: total fetch execution time: 0.0003s for 1 rows.
CoreData: annotation: fault fulfilled from database for : 0x925e06e240bb7feb <x-coredata://D99D4673-2788-4E00-90D6-811007DDF5AA/AnimalActivitySettingBase/p20920>
CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZACTIVITYTAGID, t0.ZACTIVITYTAGSTATUS t0 WHERE t0.Z_PK = ?
CoreData: annotation: sql connection fetch time: 0.0002s
CoreData: annotation: total fetch execution time: 0.0003s for 1 rows.
CoreData: annotation: fault fulfilled from database for : 0x925e06e287177feb <x-coredata://D99D4673-2788-4E00-90D6-811007DDF5AA/AnimalActivitySettingBase/p24659>
CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZACTIVITYTAGID, t0.ZACTIVITYTAGSTATUS t0 WHERE t0.Z_PK = ?
CoreData: annotation: sql connection fetch time: 0.0002s
CoreData: annotation: total fetch execution time: 0.0003s for 1 rows.
CoreData: annotation: fault fulfilled from database for : 0x925e06e2ce6b7feb <x-coredata://D99D4673-2788-4E00-90D6-811007DDF5AA/AnimalActivitySettingBase/p29196>
CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZACTIVITYTAGID, t0.ZACTIVITYTAGSTATUS t0 WHERE t0.Z_PK = ?
CoreData: annotation: sql connection fetch time: 0.0002s
CoreData: annotation: total fetch execution time: 0.0004s for 1 rows.
CoreData: annotation: fault fulfilled from database for : 0x925e06e281bf7feb <x-coredata://D99D4673-2788-4E00-90D6-811007DDF5AA/AnimalActivitySettingBase/p25081>
CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZACTIVITYTAGID, t0.ZACTIVITYTAGSTATUS t0 WHERE t0.Z_PK = ?
CoreData: annotation: sql connection fetch time: 0.0003s
附言
更改returnsObjectsAsFaults
为true\false
不修复它。
PS2
我正在使用 iOS10 CoreData API NSPersistentContainer
。我在继续viewContext
。
解决方案
推荐阅读
- java - 使用流初始化对象
- php - Laravel 注册用户创建群组
- awk - 从 nslookup grep 所有 IP 地址
- activerecord - Statesman Gem with Rails 5 - ActiveRecord 转换没有发生
- push-notification - 更新 PUSH_DEVICES 表中的 UserID 和 PhoneNumber
- bash - 获取两个给定变量字符串之间的内容
- pandas - 如何在数据框的任何列中删除特定值?
- phpstorm - PhpStorm HTML 快捷方式
- firebase - 如何在之前创建的文档中添加字段?
- android - 企业内部的管理 API 和应用程序分发