Я разрабатываю приложение 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
}