У меня есть NSFetchResultController, связанный с UICollectionView и
Мне нужно синхронно удалять элементы внутри сущности, а затем вставлять новые записи.
У меня разные контексты для NSFetchResultController и операции удаления.
public func clearData(entity: String) {
let parentContext = delegate.persistentContainer.viewContext
let context = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
context.automaticallyMergesChangesFromParent = false
context.parent = parentContext
parentContext.mergePolicy = NSOverwriteMergePolicy
context.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: entity)
let batchDeleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)
parentContext.perform {
autoreleasepool {
do
{
do {
try parentContext.execute(batchDeleteRequest)
} catch let error {
print("ERROR DELETING : \(error)")
}
}
}
}
}
public func create_folder(params : [String : Any]) {
let parentContext = delegate.persistentContainer.viewContext
let context = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
context.parent = parentContext
context.automaticallyMergesChangesFromParent = true
parentContext.automaticallyMergesChangesFromParent = true
let objectFetch = NSFetchRequest<NSFetchRequestResult>(entityName: "Folders")
objectFetch.predicate = NSPredicate(format: "folderKey == %@", params["folderKey"] as! String)
do {
if let fetchResults = try context.fetch(objectFetch) as? [NSManagedObject] {
if (fetchResults.count == 0) {
let newValue = NSEntityDescription.insertNewObject(forEntityName: "Folders", into: context) as! Folders
newValue.setValue(params["category_id"], forKey:"category_id")
try context.save()
self.add_value(value: newValue, context: context)
}
private func add_value(value: NSManagedObject, context: NSManagedObjectContext) {
let parentContext = delegate.persistentContainer.viewContext
parentContext.mergePolicy = NSOverwriteMergePolicy
context.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
context.parent = parentContext
context.automaticallyMergesChangesFromParent = true
context.performAndWait {
autoreleasepool {
do
{
try context.save()
parentContext.perform {
do {
try parentContext.save()
} catch {
print("Failture to save context: \(error)")
parentContext.rollback()
}
}
}
catch
{
context.rollback()
}
}
}
}
Вот NSFetchResultController, связанный с UICollectionView:
lazy var fetchedResultsControler: NSFetchedResultsController<Folders> = {
let delegate = UIApplication.shared.delegate as! AppDelegate
let context = delegate.persistentContainer.viewContext
let fetchRequest = NSFetchRequest<Folders>(entityName: "Folders")
fetchRequest.sortDescriptors = [NSSortDescriptor(key: "sort_id", ascending : false)]
let frc = NSFetchedResultsController(fetchRequest: fetchRequest,
managedObjectContext: context,
sectionNameKeyPath: nil,
cacheName: nil)
frc.delegate = self
return frc
}()
Когда я делаю эти операции в одном и том же контексте, я получаю пустой результат в NSFetchResultController, но я ожидаю, что новые записи будут вставлены ... Если я делаю эти операции в другом контексте - я получаю их несинхронизированными и могу видеть результат внутри NSFetchResultController только после перезагрузки приложения ...
Как удалить, а затем вставить синхронно?