Проблема инициализации NSTableview с NSFetchedResultsControllerDelegate - PullRequest
0 голосов
/ 05 марта 2020

Я разрабатываю приложение MacOS, которое отображает данные в таблице, где источник данных контролируется FetchedResultsController. Проблема заключается в том, что при инициализации приложения метод numberOfRows иногда вызывается перед методом loadView.

Поскольку метод fetchedResultsController.performFetch предположительно должен выполняться в loadView, когда numberOfRows выполняется до loadView затем numberOfRows возвращает 0, и отображается пустая таблица.

Что странно, порядок вызовов кажется случайным, примерно в половине случаев порядок выполнения верен, а в других случаях неверен. Вот мой код:

<!-- language: lang-swift -->
//MARK: Controller
class MetricsViewController: NSViewController, NSTableViewDelegate, NSTableViewDataSource, NSFetchedResultsControllerDelegate {

    @IBOutlet weak var tableView: NSTableView!

    let managedObjectContext = (NSApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

    lazy var fetchedResultsController: NSFetchedResultsController<Metrics> = {
        let fetchRequest = NSFetchRequest<Metrics>(entityName: "Metrics")
        fetchRequest.sortDescriptors = [
            NSSortDescriptor(key: "ticker", ascending: true),
            NSSortDescriptor(key: "date", ascending: false),
        ]
        let fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: self.managedObjectContext, sectionNameKeyPath: nil, cacheName: nil)

        // Configure Fetched Results Controller
        fetchedResultsController.delegate = self

        return fetchedResultsController
    }()

    //MARK: ViewController
    override func loadView() {
        super.loadView()
        print("loadView")
        do {
            try self.fetchedResultsController.performFetch()
        } catch {
            let fetchError = error as NSError
            print("\(fetchError), \(fetchError.userInfo)")
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.tableColumns[0].sortDescriptorPrototype = fetchedResultsController.fetchRequest.sortDescriptors![0]
        tableView.tableColumns[1].sortDescriptorPrototype = fetchedResultsController.fetchRequest.sortDescriptors![1]
    }

    //MARK: TableViewDataSource
    func numberOfRows(in tableView: NSTableView) -> Int {
        print("numberofRows")
        return fetchedResultsController.fetchedObjects?.count ?? 0
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...