Каков метод замещения этого устаревшего вызова 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

Затем он работает как шарм:)