Nano Hash - криптовалюты, майнинг, программирование

Нужно ли мне реализовывать уведомления NSManagedObjectContext при использовании нескольких CoreData NSManagedObjectContexts?

В настоящее время в моем приложении есть 2 контекста. Мое приложение использует несколько вкладок, поэтому на одной вкладке могут отображаться данные, а на другой - в режиме ввода данных.

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

Я читал руководство по параллелизму яблок: http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/coredata/Articles/cdConcurrency.html#//apple_ref/doc/uid/TP40003385-SW1

Это указывает на то, что вы должны использовать уведомления для распространения изменений между контекстами.

Оба моих контекста используют один и тот же объект хранилища распространения. У меня вопрос: если в контекст A на вкладке A будет внесено изменение, когда запрос на выборку будет повторно выдан на вкладке B с использованием контекста B, будут ли изменения просто отображаться на вкладке B?

Это то, что я наблюдаю сейчас. Я предполагаю, что кэширование основных данных выполняется на уровне хранилища распространения? Если это правильно, то синхронизация контекстов требуется только тогда, когда вы не собираетесь повторно запускать запрос на выборку, чтобы вы могли выборочно обновлять только те NSManagedObjects, которые изменились?

Вот как я получаю свой новый контекст:

   NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    NSManagedObjectContext *newContext;
    if (coordinator != nil) {
        newContext = [[NSManagedObjectContext alloc] init];
        [newContext setPersistentStoreCoordinator:coordinator];
    }

Ответы:


1

Если вы хотите, чтобы данные, которые вы изменяете на вкладке B, отображались на вкладке A (и наоборот), когда вы используете два разных NSManagedObjectContexts, вам необходимо добавить наблюдателя в уведомление

NSManagedObjectContextDidSaveNotification

в коде контроллера для вкладки A (и B, если в A вносятся изменения)

as in

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mergeChanges:) name:NSManagedObjectContextDidSaveNotification object:nil];

Затем в заявленном селекторе

-(void)mergeChanges:(NSNotification *)anotif
{
    [self.managedObjectContext mergeChangesFromContextDidSaveNotification:anotif];
    [self updateTheUI];
}
18.08.2012
  • На вкладке B, если я просто повторно отправлю запрос на выборку, который включает объект (ы) из вкладки A, я вижу новые данные. Вот почему мне было интересно, рекомендуются ли яблоки только в том случае, если вы хотите выборочно обновить существующие NSManagedObjects уже в вашем контексте, поскольку похоже, что запрос на выборку все равно перезагружает их. Я просто хотел убедиться, что это так. 18.08.2012
  • Если вы используете NSFetchedResultsController, я думаю, что приведенный выше код будет создан для вас автоматически. В противном случае вы не должны видеть изменений в контексте A в контексте B, пока вы не выполните слияние явно, как указано выше. У вас действительно есть 2 уникальных объекта MOC? 18.08.2012
  • Я не использую NSFetchedResultsController. Я отредактировал сообщение кода, чтобы показать, как я создаю новый контекст. Все контексты используют один и тот же объект координатора постоянного хранилища. 18.08.2012
  • Ах ах! Изменения, которые вы вносите в управляемый объект в одном контексте, не распространяются на соответствующий управляемый объект в другом контексте, если вы не выполните повторную выборку или повторную неисправность объекта. Должно быть, я пропустил этот бит, как я и думал, спасибо за помощь. 18.08.2012

  • 2

    «Изменения, которые вы вносите в управляемый объект в одном контексте, не распространяются на соответствующий управляемый объект в другом контексте, если вы не выполните повторную выборку или повторную неисправность объекта».

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

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..