首页 > 解决方案 > `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

附言

更改returnsObjectsAsFaultstrue\false不修复它。

PS2

我正在使用 iOS10 CoreData API NSPersistentContainer。我在继续viewContext

标签: iosswiftcore-data

解决方案


推荐阅读