Как функционирует NSFetchedResultsController и Ваш уполномочь тебя?

Как хорошо он говорит вопрос, я хочу знать, как оно функционирует NSFetchedResultsController и потому что использовать методы delegate вместо tableView.reloadData.

Я использую их, чтобы вооружать одну TableView но он не идет ни для чего хорошо, загрузив app, не показывает мне организации в каждый cell и добавив новую организацию, lagea и, они даже не являются линиями ячеек.

Я оставляю проект в dropbox:

https://www.dropbox.com/sh/4fo8h7c4q21t16h/AAAVYOB1rP3zDrq3hwjKG8SWa? dl=0

и немного кода внизу.

class TableViewController : UITableViewController, AddCourseViewControllerDelegate, NSFetchedResultsControllerDelegate {

    var managedObjectContext : NSManagedObjectContext!

    //Este objeto se encarga de integrar un fetchRequest con la ViewController.
    lazy var fetchedResultController : NSFetchedResultsController = {//Es un closure que devuelve un objeto.
        () -> NSFetchedResultsController in

        let fetch = NSFetchRequest()
        let entity = NSEntityDescription.entityForName("Course", inManagedObjectContext: self.managedObjectContext)
        let sort = NSSortDescriptor(key: "author", ascending: true)

        fetch.entity = entity
        fetch.sortDescriptors = [sort]

        let fetchedResult : NSFetchedResultsController = NSFetchedResultsController(fetchRequest: fetch, managedObjectContext: self.managedObjectContext, sectionNameKeyPath: "author", cacheName: nil)

        fetchedResult.delegate = self

        return fetchedResult
    }()

    override func viewDidLoad() {
        super.viewDidLoad()

        do {
            try fetchedResultController.performFetch()
        } catch {
            print("Error")
        }


    }

    func controllerWillChangeContent(controller: NSFetchedResultsController) {
        self.tableView.beginUpdates()
    }

    func controllerDidChangeContent(controller: NSFetchedResultsController) {
        self.tableView.endUpdates()
    }


    //Mark: - NSFetchedResultController delegate methods

    func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) {
        switch type {
        case .Delete:
            tableView.deleteRowsAtIndexPaths([indexPath!], withRowAnimation: .Fade)
            break;
        case .Insert:
            tableView.insertRowsAtIndexPaths([newIndexPath!], withRowAnimation: .Fade)
                break;
        case .Move:
            tableView.moveRowAtIndexPath(indexPath!, toIndexPath: newIndexPath!)
                break;
        case .Update:
            let curso = controller.objectAtIndexPath(indexPath!) as! Course
            let cell = tableView.cellForRowAtIndexPath(indexPath!)
            cell?.textLabel?.text = curso.title
            cell?.detailTextLabel?.text = curso.author
                break;
        }

    }

    func controller(controller: NSFetchedResultsController, didChangeSection sectionInfo: NSFetchedResultsSectionInfo, atIndex sectionIndex: Int, forChangeType type: NSFetchedResultsChangeType) {

        switch type {
        case .Insert:
            let set = NSIndexSet(index: sectionIndex)
            tableView.insertSections(set, withRowAnimation: .Fade)
            break;
        case .Delete:
            let set = NSIndexSet(index: sectionIndex)
            tableView.deleteSections(set, withRowAnimation: .Fade)
            break;
        default:
            break;
        }



    }

    //MARK: - TableView dataSource

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return fetchedResultController.sections!.count
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return fetchedResultController.sections![section].numberOfObjects
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("Cell")!

        let course : Course = (fetchedResultController.fetchedObjects![indexPath.row]) as! Course

        cell.textLabel!.text = course.title
        cell.detailTextLabel!.text = course.author

        return cell
    }


    private func getFetchedController() -> NSFetchedResultsController {
        let fetch = NSFetchRequest()
        let entity = NSEntityDescription.entityForName("Course", inManagedObjectContext: self.managedObjectContext)
        let sort = NSSortDescriptor(key: "author", ascending: true)

        fetch.entity = entity
        fetch.sortDescriptors = [sort]

        let fetchedResult = NSFetchedResultsController(fetchRequest: fetch, managedObjectContext: self.managedObjectContext, sectionNameKeyPath: "author", cacheName: nil)

        return fetchedResult
    }


    //MARK: - AddCourseDelegate

    func addCourseViewControllerDidSave() {
        do {
            try managedObjectContext.save()
        } catch {
            print("Error al guardar el curso.")
        }
        self.dismissViewControllerAnimated(true, completion: nil)
    }

    func addCourseViewControllerDidCancel(curso : Course) {
        managedObjectContext.deleteObject(curso)
        self.dismissViewControllerAnimated(true, completion: nil)
    }


    //MARK: - Segue way

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "addCourseSegue" {
            let nextVc = segue.destinationViewController as! AddCourseViewController
            nextVc.delegate = self

            let selectedCourse = NSEntityDescription.insertNewObjectForEntityForName("Course", inManagedObjectContext: managedObjectContext) as! Course
            nextVc.course = selectedCourse

        }
    }


}

0
задан 15.03.2017, 00:00
1 ответ

Чтобы использовать tableview ты нуждаешься 2 делегата (UITableViewDataSource и UITableViewDelegate) для того, чтобы драйвер знал, как должна делать таблица, он будет должен знать все секции есть, все линии есть из-за каждой секции, и т.д. (tableviewdelegate) и после он будет должен спрашивать у кого-то (datasourcedelegate), что информация помещать в каждой ячейке.

Как только у тебя есть данные каким-то образом (Core датирует, SQLite в смелых, array, или поскольку он был) у тебя должен быть способ мочь предоставлять в таблицу необходимую информацию для того, чтобы он узнал секции, линии из секции, и что информация идет в каждой ячейке. Если ты используешь Coredata, этот делает все автоматически, но если у тебя есть другой источник данных, ты должен искать жизнь для proporcinarsela. Причина не использовать tableView.reloadData () и уже, потому что этот метод единственное, что он делает, состоит в том, чтобы говорить ему в драйвер, чтобы он вновь вооружал таблицу, так что он вновь будет звонить в методы numberOfSections, numberOfRows, и т.д., а следовательно нужно осуществлять эти методы, если или если. И в принципе ты не был бы должен звонить в метод reloadData (), загрузив драйвер уже, это делает он.

NSFetchResultsController, что он делает, состоит в том, чтобы консультировать BD в SQLite через CoreData и продолжают манипулировать данными и предоставлять методы DataSource, который нуждался в таблице. Таблица спрашивает и NSFetchresultcontroller дает ему информацию. NSFetchresultsController ты это конфигурируешь для того, чтобы hága поиски в организации, которую ты говоришь ему, упорядоченный формы, которая и он занимается всем остальным. Он занят тем, что управляет о памяти, просит больше данных, освобождать то, что уже они не появляются, соглашаться на связи, и т.д.

Я смотрел код немного сверху, и он, кажется, не имеет "ошибок", более или менее оно было бы должно функционировать. Я советую тебе, чтобы ты поместил какой-то предел прочности в методы numberOfSectionsInTableView, cellForRowAtIndexPath и numberOfRowsInSection, чтобы подтверждать, что там у тебя есть правильная информация, которая была бы должна появляться. То же самое твоя проблема эта в определении модели, также ты не определяешь ошибку, которая появляется у тебя, говоришь, что оно не функционирует.

1
ответ дан 24.11.2019, 14:19
  • 1
    Спасибо за помощь. Проблема состояла в том, что он не показывал мне " rows" организации и уже я нашел проблему. Он использовал fetchedResultController.fetchedObjects! [indexPath.row] схвати! Course вместо fetchedResultController.objectAtIndexPath (indexPath) схвати! Course – MatiEzelQ 21.05.2016, 17:05