Синхронизация основных данных в режиме реального времени между WatchKit и приложением

Я пишу расширение WatchKit для приложения iPhone. Я делюсь основными данными с помощью групп приложений. Это работает, данные разделены. Теперь я хочу обновить данные внутри приложения для iPhone, если приложение работает на переднем плане и новая запись базы данных добавляется из часов в базу данных. Чтобы отслеживать, что я подписался на NSManagedObjectContextDidSaveNotification

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

метод слияния:

- (void)mergeChanges:(NSNotification *)notification {
    if(notification.object != self.managedObjectContext) {
        [self performSelectorOnMainThread:@selector(updateMainContext:) withObject:notification waitUntilDone:NO];
    }
}

обновить метод основного контекста:

- (void)updateMainContext:(NSNotification *)notification {
    assert([NSThread isMainThread]);
    [self.managedObjectContext mergeChangesFromContextDidSaveNotification:notification];
}

Я пытаюсь протестировать его на симуляторе (одновременно запустив симулятор iPhone и Watch), но, к сожалению, NSManagedObjectContextDidSaveNotification не вызывается.

Реально ли это проверить на симуляторе? Если да, то правильный ли это подход?


person sash    schedule 25.03.2015    source источник


Ответы (1)


Вы не можете использовать NSNotificationCenter, так как приложение iOS и расширение — это разные процессы. Посмотрите на использование MMWormhole для размещения ваших собственных уведомлений между процессами. Вы можете прослушивать NSManagedObjectContextDidSaveNotification в своем расширении и приложении iOS, а затем использовать MMWormhole, чтобы сообщить другому процессу об уведомлении. Кроме того, вам потребуется вручную обновить управляемые объекты данных (см. [NSManagedObjectContext refreshObject:(NSManagedObject *)object mergeChanges:(BOOL)flag]).

person Stephen Johnson    schedule 25.03.2015
comment
Спасибо за помощь. У меня сложилось впечатление, что если приложение и часы используют один и тот же NSPersistentStore (файл sqlite), то я смогу отслеживать в нем изменения. Я ошибся? Я думал, что это будет похоже на работу с несколькими контекстами в разных потоках. - person sash; 26.03.2015
comment
Поскольку расширение WatchKit и приложение iOS работают в разных процессах, они не взаимодействуют друг с другом. Когда у вас есть два потока, работающих в одном процессе, они могут взаимодействовать друг с другом. Таким образом, вы должны управлять общением. Я добавил его в свое расширение WatchKit, и это не требует слишком много дополнительной работы. - person Stephen Johnson; 26.03.2015
comment
На самом деле я уверен, что это ДОЛЖНО работать. Вы можете использовать Центр уведомлений для прослушивания вещей в расширении WatchKit, и то, что он пытается прослушать, — это NSManagedObjectContext, который был настроен из приложения WatchKit, которое подключено к постоянному хранилищу, которое совместно используется приложениями с помощью групп приложений. . Или я что-то здесь упускаю? У меня есть приложение для наблюдения за изменениями в общей базе данных с помощью NSFetchedResultsController. - person lramirez135; 27.03.2015
comment
Я думал, что он пытается прослушать изменения, внесенные в постоянное хранилище в приложении iOS в своем расширении WatchKit. Да, вы можете заставить свое расширение прослушивать изменения, внесенные в расширение. - person Stephen Johnson; 27.03.2015
comment
Хм, но я думаю, что я имел в виду следующее: предположим, у вас есть постоянное хранилище, которое совместно используется телефоном и добавочным номером, и у вас есть стек CoreData, настроенный на вашем добавочном номере, который подключен к этому постоянному хранилищу. Теперь ваш iPhone вносит изменения в этот магазин, стек CoreData на расширении ваших часов должен реагировать на них, верно? - person lramirez135; 27.03.2015
comment
Когда вы говорите, что ваш iPhone вносит изменения в этот магазин, вам нужно указать, является ли это расширением WatchKit, работающим на iPhone, или приложением iPhone, работающим на iPhone. Оба процесса выполняются на iPhone. Они не могут взаимодействовать с NSNotificationCenter, поскольку это разные процессы. - person Stephen Johnson; 28.03.2015
comment
@StephenJohnson Как обновить контекст управляемого объекта (на телефоне), чтобы он был вновь создан (на часах) NSManagedObject? refreshObject будет обновлять только существующий объект. Спасибо. - person sash; 09.04.2015
comment
Я установил stalenessInterval в NSManagedObjectContext на 1, и у меня не было никаких проблем с моими запросами, получающими устаревшие данные о дате. - person Stephen Johnson; 10.04.2015