Нет необходимости форсировать refre sh, это IMO не чистое решение.
Как вы правильно упомянули в своем вопросе, в памяти все еще есть элементы. Решение состоит в том, чтобы обновить объекты в памяти после выполнения с помощью mergeChanges
.
В этом сообщении в блоге подробно объясняется решение в разделе «Обновление объектов в памяти».
Там автор предоставляет расширение NSBatchDeleteRequest
следующим образом
extension NSManagedObjectContext {
/// Executes the given `NSBatchDeleteRequest` and directly merges the changes to bring the given managed object context up to date.
///
/// - Parameter batchDeleteRequest: The `NSBatchDeleteRequest` to execute.
/// - Throws: An error if anything went wrong executing the batch deletion.
public func executeAndMergeChanges(using batchDeleteRequest: NSBatchDeleteRequest) throws {
batchDeleteRequest.resultType = .resultTypeObjectIDs
let result = try execute(batchDeleteRequest) as? NSBatchDeleteResult
let changes: [AnyHashable: Any] = [NSDeletedObjectsKey: result?.result as? [NSManagedObjectID] ?? []]
NSManagedObjectContext.mergeChanges(fromRemoteContextSave: changes, into: [self])
}
}
Вот обновление вашего кода о том, как его вызвать:
func deleteAll() {
let fetchRequest: NSFetchRequest<NSFetchRequestResult> = ToDoItem.fetchRequest()
let deleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)
let persistentContainer = (UIApplication.shared.delegate as! AppDelegate).persistentContainer
do {
try persistentContainer.viewContext.executeAndMergeChanges(deleteRequest)
} catch let error as NSError {
print(error)
}
}
Здесь также есть дополнительная информация по этой ссылке: Базовые данные NSBatchDeleteRequest оставляет объекты в контексте .