2014-12-31 2 views
1

У меня есть приложение с расширением widget Today. Мне нужно приложение, виджет и другие экземпляры приложения и виджета на других устройствах для совместного использования данных, поэтому я использую интеграцию iCloud Core Data. Сначала у меня было приложение и виджет (внутри одного устройства), которые совместно использовали один и тот же хранилище основных данных (sqlite) в каталоге общих контейнеров. Теперь я включил синхронизацию iCloud, и это работает между устройствами, но теперь я получаю противоречивые данные, отображаемые между приложением и виджетами на одном устройстве (?!?). Проблема может быть связана с моим циклом обновления графического интерфейса виджета или подпиской Центра уведомлений, который я по-прежнему устраняю, но в то время как я это делаю:Правильный способ обмена данными между приложением и виджнем Today при использовании Core Data + iCloud sync

Что такое «правильное» решение для обмена данными из Core Data между приложением и виджет (или два приложения, которые, как я полагаю), на том же устройстве, когда вы используете Core Data + iCloud? Должны ли они использовать один физический магазин, или каждый из них имеет свой собственный магазин? Есть ли какие-либо проблемы, если оба подхода действительны?

+0

Приложение Apple's [Lister] (https://developer.apple.com/library/prerelease/ios/samplecode/Lister/Introduction/Intro.html) предоставляет рабочий пример. –

ответ

1

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

Предполагая, что это не вариант, и вы действительно нужен весь магазин, у вас есть два варианта:

  1. Share один магазин в общий контейнер
  2. принять решение синхронизации данных керна и есть отдельные магазины для вашего основного приложения и расширения.

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

Чтобы обойти это, вам нужно будет найти способ передать идентификаторы объектов измененных объектов из одного процесса в другой, чтобы процесс получения мог обновлять объекты и повторно извлекать последние данные.

Второй вариант включает два отдельных магазина и средство передачи изменений. Если вы идете с iCloud + Core Data, iCloud - это механизм передачи, который немного перехитрит, учитывая, что ваши процессы находятся на одном устройстве.

Я полагаю, что Apple даже предупреждала об использовании этого решения в iOS, потому что если приложение iOS перейдет на задний план, возможно, он будет остановлен, когда координатор файла заблокирован в файле, и это может стать причиной блокировки в другом процессе.

iCloud + Core Data - это не единственное решение для синхронизации. Лучшим решением в этом случае может быть структура Ensembles, которую я разрабатываю. Причина, по которой я говорю, заключается в том, что она имеет возможность синхронизации через локальные файлы, вместо того, чтобы требовать облачную службу. Вы можете настроить отдельные магазины для своего расширения и основного приложения, а ансамбли использовать общий контейнер для передачи наборов изменений. Отсутствие участия в облаке и отсутствие проблем с файловой координацией.

+0

Спасибо @ Drew, я слышал об Ensembles, и я действительно прочитал вашу статью синхронизации данных на objc.io. Два пояснения: 1. Да, я думаю, мне нужно сделать достаточно большой кусок моей модели, доступной для виджета, а виджету нужно писать данные, поэтому я не думаю, что второй уровень сохранения является хорошей идеей. 2.У меня действительно есть потребность синхронизировать между устройствами в дополнение к on-device - поэтому использование облачной или P2P-синхронизации не является дополнительным накладным расходами, инвестиции должны быть сделаны в любом случае. Я нацелился на Core Data + iCloud, потому что это похоже на решение KISS, но я снова посмотрю на Ensembles. –

+0

Я начал искать рекомендацию Apple, основанную на блокировании координации файлов между двумя процессами, и я думаю (это то, о чем вы думаете) (https://developer.apple.com/library/ios/technotes/tn2408/_index .html), но, по-видимому, это рекомендация против использования, скажем, файлов .plist или других плоских файлов для координации, и на самом деле он говорит: «Вместо этого используйте CFPreferences, атомно-безопасные операции сохранения на плоских файлах, SQLite или Core Data». Это имеет смысл, я бы предположил (надеюсь?), Что Core Data использует какую-то операцию с атомарным файлом, которую приложение не может быть легко прервано. –