Почему происходит сбой этого приложения, если я проверяю причину и обхожу код, нарушающий работу?

У меня есть этот код, где я пытаюсь получить все записи для определенного ключа:

//  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 или передать контекст от одного контроллера представления другому.

Другие вопросы по тегам