Каков метод замещения этого устаревшего вызова MagicalRecord?
Как найти метод замены в MagicalRecord для этого (который устарел)? Я посмотрел на Google, SO и документы; ничто не кажется заменой, и, конечно, ничто в документах не говорит вам, что заменило устаревший метод.: - {
[[NSManagedObjectContext MR_contextForCurrentThread] MR_saveErrorHandler:^(NSError *error)
Ответы
Ответ 1
Этот устаревший метод:
[NSManagedObjectContext MR_contextForCurrentThread]
Я написал немного сообщение в блоге об этом некоторое время назад, хотя я признаю, что это в моем личном блоге, а не в каких-либо официальных документах. Но, TL; DR, нижняя строка, в мире GCD и очередей, вы не можете гарантировать отображение 1-1 очереди в поток, несмотря на то, что GCD запускается в потоках. Чтобы убедиться, что все работает в будущем, вы используете следующий шаблон:
[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
//make your changes in the localContext
}];
Это решает тонкие проблемы с перекрестными потоками, которые возникают в contextForCurrentThread
, просто применяя правило, которое вы должны делать, все работают в другом потоке в конкретном контексте потока. Создавая новый контекст каждый раз, когда вы сохраняете, а не повторно используете контекст, вы гарантируете, что не будете перекрещивать потоки и не разбивать свое приложение на 1% времени.
Ответ 2
casademora верна, но я постараюсь быть более точным, потому что у меня возникают некоторые проблемы при конвертации моих
[[NSManagedObjectContext MR_contextForCurrentThread] MR_saveToPersistentStoreWithCompletion:nil];
в
[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext)
Вы должны быть осторожны, чтобы изменить или создать свои объекты внутри блока, но этого недостаточно.
Чтобы получить ваши сущности, вы также должны использовать запрос выбора с контекстом.
MR_findFirstByAttribute:withValue
недостаточно, и обновления не будут сохранены. Вместо этого вы должны использовать
MR_findFirstByAttribute:withValue:InContext:localContext
И при создании объекта он будет тем же
MR_createEntity
должно быть изменено на
MR_createEntityInContext:localContext
Затем он работает как шарм:)