Хобрук: Ваш путь к мастерству в программировании

MagicalRecord saveWithBlock против saveToPersistentStoreAndWait

Я очень стараюсь понять все о MagicalRecord и CoreData. Итак, скажем, у меня есть 2 фрагмента кода, делающие одно и то же, где tallyM — это управляемый объект, работающий в MR_defaultContext.

Вариант 1:

Tally *tallyM                       = (Tally *)[Tally MR_findFirstWithPredicate:predicateM];

[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {

    Tally *tallyMLocal              = [tallyM MR_inContext:localContext];
    tallyMLocal.tl_countMale        = [NSString stringWithFormat:@"%ld", (long)uiTallyMaleCounter];

} completion:^(BOOL success, NSError *error) {

        [self updateTallies_APICall:[tallyM MR_inContext:[NSManagedObjectContext MR_defaultContext]]];
}];

Вариант 2:

Tally *tallyM                       = (Tally *)[Tally MR_findFirstWithPredicate:predicateM];
tallyM.tl_countMale                 = [NSString stringWithFormat:@"%ld", (long)uiTallyMaleCounter];
[tallyM.managedObjectContext MR_saveToPersistentStoreAndWait];
[self updateTallies_APICall:[tallyM MR_inContext:[NSManagedObjectContext MR_defaultContext]]];

Вопросы:

  1. Какая из них лучше? Я понимаю, что saveWithBlock можно использовать, когда вам нужно асинхронное сохранение, но есть ли другая разница? Является ли Вариант 1 безопаснее или лучше, чем Вариант 2?

  2. В варианте 1 у меня есть tallyM, который работает в MR_defaultContext. Затем внутри saveWithBlock я изменяю tallyM, изменяя tallyMLocal и сохраняя контексты. Могу ли я быть на 100% уверен, что после запуска saveWithBlock в обработчике завершения (когда мне нужно продолжить работу с tallyM) tallyM (который все еще работает в MR_defaultContext) обновит tl_countMale?

  3. В Вариант 1 в обработчике завершения мне все еще нужно вызывать приведенный ниже код? Я предполагаю (уже проверил с помощью консоли, но просто хочу убедиться), что tallyM все еще работает в MR_defaultContext после выполнения saveWithBlock. Так нужно ли снова вызывать MR_inContext?

    [tallyM MR_inContext:[NSManagedObjectContext MR_defaultContext]]

  4. Допустим, мне вообще не нужно асинхронное сохранение. Поэтому я могу использовать вариант 2 или saveWithBlockAndWait. Чем saveWithBlockAndWait лучше, чем Вариант 2?

Я просто хочу убедиться, что наконец правильно понял, как ведут себя MagicalRecords и CoreData.


Ответы:


1

Лично я бы избегал шаблона в Варианте 2. Идея заключается в том, что вы должны использовать один контекст управляемого объекта в качестве области действия для операций над набором управляемых объектов. Вот почему в большинстве примеров используется следующий шаблон:

NSManagedObjectContext *localContext = //...;
NSManagedObject *localObject = [otherObject MR_inContext:localContext];
///make changes to localObject
[localContext MR_saveToPersistentStoreAndWait];

Метод [MagicalRecord saveWithBlock:] в основном реализует этот шаблон в более удобном API.

Я бы также рекомендовал не использовать defaultContext неявно. Будьте более явными в своем коде, потому что вам может понадобиться поменять местами, когда ваше приложение начнет работать с потоками.

Обработчики завершения написаны таким образом, что они всегда вызываются после завершения операции сохранения на 100%. Я рекомендую прочитать исходный код, чтобы убедиться в этом самостоятельно.

16.06.2014
Новые материалы

Как свинг-трейдеры могут использовать ИИ для больших выигрышей
По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

Как построить любой стол
Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

Обзор: Машинное обучение: классификация
Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

Разработка расширений Qlik Sense с qExt
Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..

React Hooks: основы деструктуризации массива
Kent C. Dodds написал классный пост о том, как грядущая функция React под названием Hooks работает на капоте. Предстоящий хук React useState основан на деструктурировании массива, давайте..

Пакеты R, используемые в Tesla
Добро пожаловать обратно! R — очень популярный язык программирования, используемый множеством компаний, включая Tesla! Итак, давайте взглянем на некоторые пакеты R, которые использует Tesla...

Сокращение и слияние токенов для эффективных моделей VL: обзор
Часто в задачах, связанных с компьютерным зрением и НЛП, вычислительно затратная и требующая большого объема памяти обработка становится препятствием для более быстрого логического вывода модели, а..