Как использовать Magical Record для создания и обновления объектов и сохранения их без использования contextForCurrentThread

Я просто прочитал автора сообщения MagicalRecord о том, почему contextForCurrentThread не работает в MagicalRecord .

contextForCurrentThread устарел и saveWithBlock следует использовать вместо этого, потому что он создает безопасный новый NSManagedObjectContext для соответствующего потока.

До сих пор я широко использовал contextForCurrentThread в своем приложении. Тем не менее, мне трудно понять, как использовать saveWithBlock что мои выборки и сохранение не обязательно происходят последовательно.

В настоящее время я делаю такие вещи, как:

 localContext = NSManagedObjectContext.MR_contextForCurrentThread person = Person.MR_createInContext(localContext) person.name = "John Smith" 

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

Затем в какой-то произвольной точке в будущем, когда пользователь решает сохранить, я запускаю этот метод:

 localContext = NSManagedObjectContext.MR_contextForCurrentThread localContext.MR_saveToPersistentStoreWithCompletion( lambda { |success, error| # ... } ) 

Каков рекомендуемый способ создания и обновления объектов, а затем сохранить их без использования contextForCurrentThread ?

3 Solutions collect form web for “Как использовать Magical Record для создания и обновления объектов и сохранения их без использования contextForCurrentThread”

Итак, я использую объективный C, а не RubyMotion, но вы должны иметь возможность делать такие вещи:

 MagicalRecord.saveWithBlock( lambda { |localContext| person = Person.MR_createInContext(localContext) #update person stuff here } ) 

РЕДАКТИРОВАТЬ

Если вы хотите сохранить контекст позже, вам просто нужно удержать его:

 // Somewhere in your ViewController, etc NSManagedObjectContext *context = [NSManagedObjectContext MR_confinementContext]; // Somewhere else Person *p = [Person MR_createInContext:context]; // And in yet another method [context MR_saveToPersistentStoreAndWait]; 

Основная идея здесь заключается в том, что вам просто нужно держаться за контекст и выполнять свои операции над ним, когда будете готовы. Если вы хотите сохранить фоновое сохранение, вы используете следующий метод:

 [context MR_saveToPersistentStoreCompletion:^(BOOL success, NSError *error){ //called on the main thread when save is complete }]; 

вот учебник для нового api: http://ablfx.com/blog/article/2 здесь ссылка: http://cocoadocs.org/docsets/MagicalRecord/2.1/

  1. в этом

    [MagicalRecord setupCoreDataStackWithStoreNamed:@"MyDatabase.sqlite"];

  2. dealloc

    [MagicalRecord cleanUp];

  3. вставить

    Person *alex = [Person MR_createEntity]; alex.name = @"Alex"; alex.age = @23;

  4. Выбрать

    / Получить все для подкласса NSArray *people = [Person MR_findAll];

    // Получить первую запись Person *aPerson = [Person MR_findFirst];

    // Получать записи условно и сортировать NSArray *people = [Person MR_findByAttribute:@"name" withValue:@"alex" andOrderBy:@"age" ascending:YES];

  5. Обновить

    // Обновление извлеченного объекта так же просто, как и управление его свойствами aPerson.age = @56;

  6. Удалить

    // Удалить все записи [Person MR_truncateAll];

    // Удалять одну запись после ее получения [alex MR_deleteEntity];

  7. спасти

    // Для любых сущностей, которые фактически должны быть сохранены / обновлены / удалены на вызов диска следующим методом [[NSManagedObjectContext MR_defaultContext] MR_saveToPersistentStoreAndWait];

    // Снова проверьте репозиторий MagicalRecord для дополнительных параметров сохранения

Я могу ошибаться здесь, но я думаю, что Magical Record не подготовлен к этому варианту использования. Вот как я буду делать то, что вы хотите, в чистых основных данных:

  1. Создайте независимый или вложенный контекст и сохраните где-нибудь (AppDelegate, singleton object и т. Д.) Ссылку на него
  2. Делайте вставки, чтения, обновления и удаления с помощью performBlock: и performBlockAndWait:
  3. Сохраните контекст с помощью:

     [context performBlock:^{ ZAssert([context save:&error], @"Save failed: %@\n%@", [error localizedDescription], [error userInfo]); }]; 

Кажется, это стандартный подход к этим проблемам. Это хорошо описано в Интернете, например, Общие справочные практики – Основные данные в фоновом режиме .

  • Приложение iOS с RubyMotion, вытягивающим из Rails API
  • RubyMotion, отклоненный Apple за отсутствующую 64-битную поддержку («Invalid binary»)
  • Как использовать React Native с RubyMotion
  • Как получить быстрый UICollectionView с большим количеством изображений (50-200)?
  • Rubymotion: Загрузка и извлечение Zip-файла в iOS
  • Удалить смещение часового пояса с даты в iOS
  • Apple отклонила приложение, потому что оно передает MAC-адрес без разрешения пользователя
  • Как протестировать версию ios без пузырьковой ловушки
  • Я ничего не должен сохранять в NSUserDefaults
  • Можно ли использовать OpenGL ES на iOS через RubyMotion?
  • Что такое идиома iOS (или RubyMotion) для ожидания на блоке, который выполняется асинхронно?
  • Interesting Posts

    UINavigationController прокручивается по кнопке «Назад»

    Можно ли использовать сжатие JPEG для изображений в pdf-файлах, созданных на iOS?

    Не получать уведомления PushKit для пользовательской зоны записи на Mac

    Загрузка многостраничного изображения ios, загруженный файл поврежден

    Какая информация хранится в iOS Spell Checker?

    Как разобрать JSON в приложении iOS

    IOS Невозможно создать экземпляр экземпляра делегата UIApplication

    создание и использование CSV-файла с помощью UIActivityViewController

    iPhone: ошибка Fontconfig: невозможно загрузить файл конфигурации по умолчанию

    Не получать didReceiveMemoryWarning, когда приложение находится в фоновом режиме

    Как получить размер клавиатуры для изменения размера UITextView и как использовать UIKeyboardFrameEndUserInfoKey с японской клавиатурой?

    RestOK PostObject с параметрами запроса

    Основные данные NSTimeInterval с использованием аксессора напрямую является ошибкой

    Почему приложение не может получить доступ к папке с документами другого приложения?

    Как перечислить файлы нескольких файлов Mime с диска Google?

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.