У меня есть работающий класс CoreDataManager, экземпляр которого создается в моем AppDelegate (когда приложение заканчивает загрузку). Класс CoreDataManager имеет «mainContext», который в свою очередь имеет «privateContext» в качестве родителя. Я могу импортировать данные и хранить их в постоянном хранилище.
Однако, когда я вызываю окно данных (управляемое подклассом NSWindowController), приложение падает, в зависимости от того, как я связываю контроллер массива с контекстом моего управляемого объекта. Я подумал о четырех способах связывания в XCode в настройках привязок контроллера массива:
Привязать контекст управляемого объекта NSArrayController к AppDelegate с помощью ключевого пути модели «mainContext» (мой AppDelegate имеет «вспомогательную ссылку» на собственный mainContext менеджера данных, и эта ссылка хранится как свойство)
Свяжите контекст управляемого объекта NSArrayController с NSApplication с помощью ключевого пути модели Delegate.coreDataManager.mainContext. (избегая удобного ссылочного свойства и переходя прямо к свойству менеджера данных)
Привязать контекст управляемого объекта NSArrayController к копии mainContext, хранящейся в моем контроллере представления (полученной через делегат приложения).
Привязать контекст управляемого объекта NSArrayController к _cdm.mainContext, _cdm - это ссылка на свойство coreDataManager AppDelegate, хранящееся как свойство контроллера представления.
Только последний подход успешен. ЗАЧЕМ???? Все они кажутся законными подходами к получению ссылки на контекст, и заявления NSLog ясно показывают, что они существуют. В зависимости от того, какой подход я использую 1 - 3, я получаю разные сообщения о сбоях. В одном случае:
(MyWinController persistentStoreCorrdinator :) нераспознанный селектор отправлен в экземпляр ...
В другом случае (после лотов для подтверждения существования стека) я получаю ...
Делегат
2018-09-03 23: 53: 27.660555-0400 Сенсей [2749: 72364] Инстанцирующий менеджер в App Delegate.
2018-09-03 23: 53: 27.660566-0400 Сенсей [2749: 72364] Он уже существовал.
2018-09-03 23: 53: 27.660585-0400 Сенсей [2749: 72364] Теперь есть доступ к менеджеру:
2018-09-03 23: 53: 27.660609-0400 Сенсей [2749: 72364] А также иметь доступ к основному контексту
2018-09-03 23: 53: 27.660629-0400 Сенсей [2749: 72364] Постоянный координатор магазина
2018-09-03 23: 53: 35.306032-0400 Сенсей [2749: 72364] [General] Невозможно выполнить операцию без контекста управляемого объекта
2018-09-03 23: 53: 35.310153-0400 Сэнсэй [2749: 72364] [General] (
0 CoreFoundation 0x00007fff9589d57b __exceptionPreprocess + 171
1 libobjc.A.dylib 0x00007fffaab051da objc_exception_throw + 48
2 CoreFoundation 0x00007fff9591ac55 + [Повышение NSException: формат:] + 197
3 AppKit 0x00007fff939aeb44 - [_ NSManagedProxy _managedObjectContext] + 66
4 AppKit 0x00007fff939aeb64 - [_ NSManagedProxy _persistentStoreCoordinator] + 22
5 AppKit 0x00007fff939aebd7 - [_ NSManagedProxy _entity] + 46
6 AppKit 0x00007fff939aee90 - [_ NSManagedProxy fetchRequestWithSortDescriptors: limit:] + 89
Я наконец-то подключил соответствующее табличное представление, и оно работает, но непонимание проблемы почти так же плохо, как не заставить его работать. Я был бы признателен за понимание того, почему привязки Какао так темпераментны в том, как вы соединяете NSArrayController с контекстом управляемого объекта Core Data, и почему некоторые из этих ссылок привязки работают, а другие - нет. Заранее спасибо.