【发布时间】:2016-11-13 15:11:29
【问题描述】:
我在使用 NSBatchDeleteRequest 后从 NSFetchedResultsControllerDelegate 获取准确更新时遇到问题,更改是作为更新类型而不是 didChange 委托方法上的删除类型来实现的。有没有办法让更改作为删除进入? (我有不同的删除和更新场景)。
删除请求: (使用调用者提供的私有上下文)
fileprivate class func deletePeopleWith(ids: Set<Int>, usingContext context: NSManagedObjectContext) {
let fr: NSFetchRequest<NSFetchRequestResult> = NSFetchRequest(entityName: "Person")
var predicates: [NSPredicate] = []
ids.forEach {
predicates.append(NSPredicate(format: "id = %ld", $0))
}
fr.predicate = NSCompoundPredicate(orPredicateWithSubpredicates: predicates)
let dr = NSBatchDeleteRequest(fetchRequest: fr)
dr.affectedStores = context.parent?.persistentStoreCoordinator?.persistentStores
do {
try context.parent?.execute(dr)
context.parent?.refreshAllObjects()
print("Deleting person")
} catch let error as NSError {
let desc = "Could not delete person with batch delete request, with error: \(error.localizedDescription)"
debugPrint(desc)
}
}
结果:
func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) {
DispatchQueue.main.async {
let changeDesc = "Have change with indexPath of: \(indexPath), new index path of: \(newIndexPath) for object: \(anObject)"
var changeType = ""
switch type {
case .delete:
changeType = "delete"
case .insert:
changeType = "insert"
case .move:
changeType = "move"
case .update:
changeType = "update"
}
print(changeDesc)
print(changeType)
}
}
印刷:
Have change with indexPath of: Optional([0, 0]), new index path of: Optional([0, 0]) for object: *my core data object*
update
【问题讨论】:
-
您正在父上下文上执行删除,并且您说要使用提供的私有上下文进行删除。
-
@ELKA 获取的结果控制器是使用父上下文创建的,父上下文也是上下文,其父上下文是应该删除记录的持久存储。
-
因此 context.parent 将是一个主要的 NSManagedObjectContext ,它与 NSFetchedResultController 的上下文相同。对吗?
-
@ELKA 是的,就是这样。
-
你可以试试
context.parent?.processPendingChanges()而不是refreshAllObjects()
标签: ios swift core-data nsfetchedresultscontroller nsbatchdeleterequest