Почему происходит сбой этого приложения, если я проверяю причину и обхожу код, нарушающий работу?
У меня есть этот код, где я пытаюсь получить все записи для определенного ключа:
// if the apptObject.aApptKey is nil, skip it...
if(apptObject.aApptKey == nil)
continue; // go to beginning and try again
// using apptObject.aApptKey, get the client's name
NSPredicate *predicate = ([NSPredicate predicateWithFormat:@"(aClientKey = %@)", apptObject.aApptKey]);
clientInfo = [ClientInfo MR_findAllWithPredicate: predicate];
Проблема в том, что я получаю эту ошибку (любезно предоставлено Crashlytics):
Неустранимое исключение: NSInvalidArgumentException +entityForName: nil не является допустимым параметром NSManagedObjectContext, ищущим имя объекта "ClientInfo"
Либо не понимаю, что говорит мне сообщение об ошибке, либо я не понимаю, как это могло произойти, если я проверяю nil до MR_findAll. Обратите внимание, что рассматриваемые "ключи" в точности совпадают, я просто использую клавишу назначения, чтобы получить имя клиента.
Может кто-нибудь объяснить, как это могло произойти?
1 ответ
(Из моего комментария:) Сообщение об ошибке не имеет ничего общего с предикатом. Он говорит вам, что NSManagedObjectContext
является nil
,
Возможная проблема может быть MR_contextForCurrentThread
метод, который устарел и больше не должен использоваться. Причина в том, что он предполагает уникальный поток для каждого контекста управляемого объекта. Это больше не относится к новым типам параллелизма MOC, которые запускаются в очередях GCD. Сравните /questions/15826806/kakov-metod-zamenyi-dlya-etogo-ustarevshego-vyizova-magicalrecord/15826810#15826810.
Лучше использовать MR_defaultContext
или передать контекст от одного контроллера представления другому.