Удалить все элементы внутри сущности и синхронизировать контекст с fetchresultcontroller - PullRequest
0 голосов
/ 05 мая 2019

У меня есть 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 только после перезагрузки приложения ...

Как удалить, а затем вставить синхронно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...