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

Мое приложение iOS и мое расширение WatchKit совместно используют группу приложений, в которой сохраняется хранилище основных данных. Модель Core Data (упрощенная) - это объект Person, у которого есть атрибут Age. И приложение, и расширение могут изменять возраст по желанию.

Если значение для человека изменится на часах, приложение не отразит его, пока я не закрою и не запущу приложение повторно. То же в противоположном направлении.

Если я попытаюсь изменить возраст на часах на 20, а возраст на телефоне на 30, то я получаю сообщение об ошибке, связанное с конфликтами слияния, потому что я не использую самую последнюю версию NSManagedObject на одном из устройств (в зависимости от того, какой возраст я меняю последним).

Как я могу заставить их работать вместе без каких-либо проблем?

6
erdekhayser 2 Мар 2015 в 07:28

2 ответа

Лучший ответ

Поскольку уведомления не будут приниматься между различными процессами, вам нужно вместо этого использовать уведомления Дарвина. Вы можете легко использовать метод openParentApplication:reply: для отправки обновлений из Watch Extension в приложение iOS, но Apple не имеет возможности отправлять события из приложения iOS в Watch Extension.

Я бы посоветовал вам использовать MMWormhole (или вы владеете реализацией уведомлений Дарвина) для отправки Дарвиновского уведомление при обновлении объекта Core Data. Здесь подробно рассказывается, как работает библиотека.

Если вы обновляете объект Core Data в Watch Extension, затем отправляете уведомление Darwin (или передаете сообщение) в приложение iOS, сообщающее приложению, что ему необходимо обновить объект Core Data. Тот же подход можно использовать и в другом направлении, от приложения iOS к расширению Watch.

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

3
cnoon 3 Мар 2015 в 03:19

Это происходит из-за того, что вы используете другой контекст управляемого объекта, который не может взаимодействовать через уведомления. Таким образом, публикация уведомления, такого как NSManagedObjectContextObjectsDidChangeNotification, не будет работать, потому что NSNotificationCenter не отправит уведомление из вашего приложения iOS в расширение, поскольку оба они являются разными процессами, запущенными в разных областях памяти. Я столкнулся с тем же в своем приложении. Перед использованием необходимо обновить объект. По сути, вы делаете ошибку вручную. Для повышения производительности вы, вероятно, захотите каким-то образом знать, когда это делать, а когда нет. Вы можете обновить объект, передав его в [NSManagedObjectContext refreshObject: mergeChanges:].

1
Stephen Johnson 2 Мар 2015 в 16:01