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

Тогда это работает как шарм:)

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