Ошибка, которую вы делаете, заключается в том, что вы не протестировали множество маленьких кусочков этого кода, которые могли работать не так, как ожидалось. Чтобы устранить неполадки, подобные этим, вы должны начать с начала и тестировать по одной части за раз. Первая проблема, которую я вижу, - это путаница между контекстами управляемого объекта…
Похоже, что метод saveManagedObjectContext
является геттером для вашего основного контекста управляемого объекта. В английском языке save является глаголом, так что это имя метода подразумевает, что оно сохраняет некоторый контекст управляемого объекта. Если я прав, вы должны изменить имя saveManagedObjectContext
на mainMangaedObjectContext
.
Оператор _managedObjectContext = [appDel managedObjectContext]
является довольно нестандартным, присваивая переменной экземпляра то, что представляется ее получателем. Если, как обычно, _managedObjectContext
является переменной экземпляра, поддерживающей свойство managedObjectContext
, этот оператор не действует.
В вашем первом методе вы используете [appDel saveManagedObjectContext]
, а во втором - [appDel managedObjectContext]
. Похоже, что они должны быть в том же контексте, чтобы ваш выбор работал. Они?
UPDATE:
Как вы указали в своем комментарии, это исправляет сохранение, но теперь у вас есть проблема с производительностью - сохранение в постоянном хранилище на диске блокирует пользовательский интерфейс, что и пытался исправить ваш оригинальный код.
Это решенная проблема. Решение состоит в том, что ваш контекст основного потока, который взаимодействует с пользователем, должен быть потомком вашего контекста фонового потока, который взаимодействует с постоянным хранилищем. Это хорошо объясняется с помощью кода в этом посте 2015 от Marcus Zarra . Для дальнейшего чтения Чед Уилкен опубликовал небольшое изменение . Оба написаны в Objective-C для вас:)