我有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()
}
}
}
}
这是链接到UICollectionView的NSFetchResultController:
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中看到结果仅在重新加载应用后...
如何删除然后插入同步?