Ios CoreData—在批处理中按关系获取对象以获得更好的性能 介绍
只要可能,我都会尝试在核心数据中使用查找或创建模式。当我为一组可由id识别的项目(不管是字符串还是int)执行此操作时,我会成批执行此操作(建议对每个项目执行一次获取): 这里唯一的键是Ios CoreData—在批处理中按关系获取对象以获得更好的性能 介绍,ios,swift,core-data,Ios,Swift,Core Data,只要可能,我都会尝试在核心数据中使用查找或创建模式。当我为一组可由id识别的项目(不管是字符串还是int)执行此操作时,我会成批执行此操作(建议对每个项目执行一次获取): 这里唯一的键是端点和项的组合 对于该实体,我对每个项目执行一次提取,因为我不知道如何在批处理中执行该操作: var foundObjects: [ItemPosition] = [] for item in items { let fetchRequest = NSFetchRequest<E>(entity
端点
和项
的组合
对于该实体,我对每个项目执行一次提取,因为我不知道如何在批处理中执行该操作:
var foundObjects: [ItemPosition] = []
for item in items {
let fetchRequest = NSFetchRequest<E>(entityName: E.entityName())
fetchRequest.predicate = NSPredicate(format: "item = %@ AND endpoint = %@", item, endpoint)
let results = try! context.fetch(fetchRequest)
if let position = results.first {
foundObjects.append(position)
}
}
var foundObjects:[ItemPosition]=[]
对于项目中的项目{
让fetchRequest=NSFetchRequest(entityName:E.entityName())
fetchRequest.predicate=NSPredicate(格式:“项=%@和端点=%@”,项,端点)
let results=try!context.fetch(fetchRequest)
如果让位置=results.first{
foundObjects.append(位置)
}
}
这不是最优的,因为它会针对每个项目访问SQL数据库,我希望避免这种情况
问题:
是否有一种方法可以通过批处理中的多个关系获取对象?类似于上面提到的NSPredicate(格式:“id IN%@”,itemIDs)met?我可以想出几种方法来实现这一点,但都不是特别优雅。您可以使用复合词或谓词:
var predicates: [NSPredicate] = []
for item in items {
predicates.append(NSPredicate(format: "item = %@ AND endpoint = %@", item, endpoint))
}
let compoundPredicate = NSCompoundPredicate.init(orPredicateWithSubpredicates: predicates)
let results = try! context.fetch(compoundPredicate)
或者,您可以通过附加端点和项目id来为ItemPosition对象生成id,并以此获取?我可以想出几种方法来实现这一点,但这两种方法都不是特别优雅的。您可以使用复合词或谓词:
var predicates: [NSPredicate] = []
for item in items {
predicates.append(NSPredicate(format: "item = %@ AND endpoint = %@", item, endpoint))
}
let compoundPredicate = NSCompoundPredicate.init(orPredicateWithSubpredicates: predicates)
let results = try! context.fetch(compoundPredicate)
或者,您可以通过附加端点和项目id来生成ItemPosition对象的id,并通过该id进行提取?是否考虑过对实体进行初始提取,然后对返回的对象数组调用
.filter
?这将允许您删除想要或不需要的对象。是否考虑过对实体进行初始提取,然后对返回的对象数组调用.filter
?这将允许您删除想要或不需要的对象。
var predicates: [NSPredicate] = []
for item in items {
predicates.append(NSPredicate(format: "item = %@ AND endpoint = %@", item, endpoint))
}
let compoundPredicate = NSCompoundPredicate.init(orPredicateWithSubpredicates: predicates)
let results = try! context.fetch(compoundPredicate)