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