Обновление табличного представления после NSBatchDeleteRequest с анимацией - PullRequest
1 голос
/ 08 февраля 2020

Мне было интересно, есть ли способ обновить табличное представление с анимацией, когда NSBatchRequest выполняется? Этот код выполняет свою работу, но нет анимации, он просто очень быстро удаляет все.

@objc func resetButtonPressed() {
    let deleteRequest = NSBatchDeleteRequest(fetchRequest: Company.fetchRequest())
    let context = CoreDataManager.shared.persistentContainer.viewContext

    do {
        try context.execute(deleteRequest)
        try context.save()
        try companyController.performFetch()
        tableView.reloadData()
    } catch let err {
        print("Unable to perform company batch delete request", err)
    }
}

Я пытаюсь получить похожую анимацию при использовании массива. Код выглядит примерно так:

@objc func resetButtonPressed() {
    // This Basically does the batch delete request
    CoreDataManager.shared.deleteAllCompanies()

    var indexsToRemove = [IndexPath]()
    for (index, _) in companies.enumerated() {
        let indexPath = IndexPath(row: index, section: 0)
        indexsToRemove.append(indexPath)
    }

    companies.removeAll()
    tableView.deleteRows(at: indexsToRemove, with: .left)
}

Я пытался сделать это, но безуспешно. Мое приложение просто продолжает падать.

@objc func resetButtonPressed() {
    let deleteRequest = NSBatchDeleteRequest(fetchRequest: Company.fetchRequest())
    let context = CoreDataManager.shared.persistentContainer.viewContext

    do {
        var indexsToRemove = [IndexPath]()
        for (_,company) in companyController.fetchedObjects!.enumerated() {
            guard let indexPath = companyController.indexPath(forObject: company) else { return }
            indexsToRemove.append(indexPath)
        }

        try context.execute(deleteRequest)
        try context.save()
        //Doesn't allow me to use this because its only a get
        companyController.fetchedObjects?.removeAll()
        //This keeps crashing my app.
        tableView.deleteRows(at: indexsToRemove, with: .fade)
    } catch let err {
        print("Unable to perform company batch delete request", err)
    }
}

Также у моего companyController есть несколько разделов. Это выглядит примерно так.

lazy var  companyController: NSFetchedResultsController<Company> = {
    let context = CoreDataManager.shared.persistentContainer.viewContext

    let request: NSFetchRequest<Company> = Company.fetchRequest()
    let nameSort = NSSortDescriptor(key: "name", ascending: true)
    let dateSort = NSSortDescriptor(key: "date", ascending: true)
    request.sortDescriptors = [nameSort,dateSort]

    //Company has a type property ex: Electronics, Gas, Groceries ...
    let controller = NSFetchedResultsController(fetchRequest: request, managedObjectContext: context, sectionNameKeyPath: "type", cacheName: nil)
    controller.delegate = self
    do {
        try controller.performFetch()
    } catch let err {
        print("Unable to fetch company in controller", err)
    }

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