CoreData и iCloud; как я могу отследить, какое устройство в последний раз сохранялось в облаке?

У меня есть приложение CoreData (использующее https://github.com/lhunath/UbiquityStoreManager), поддерживаемое iCloud . В одном случае пользователь с локальным хранилищем включает iCloud (где данные уже существуют). Я хочу предложить пользователю принять решение о переносе локальных данных в iCloud или просто использовать версию iCloud. В рамках этого я хотел бы отобразить имя устройства и дату последней синхронизации версии в iCloud.

Я возился с метаданными моего NSPersistentStore, но, похоже, они не синхронизируются с iCloud.

Какие-либо предложения?


person David Carney    schedule 13.02.2014    source источник


Ответы (3)


Вы можете использовать хранилище ключей iCloud для хранения имени устройства и даты последней синхронизации.

person jsd    schedule 13.02.2014
comment
Ага, посчитал. К сожалению, нет гарантии, что хранилище k/v будет синхронизировано с документами iCloud. - person David Carney; 14.02.2014

Мое, без сомнения, непопулярное предложение — «не надо». Попытка определить, что находится в iCloud в любой момент времени, ставит вас в довольно шаткое положение. Вы можете заставить его работать большую часть времени, но всегда будут обстоятельства, когда он сломается.

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

Стоит взглянуть на другие платформы синхронизации Core Data, такие как TICDS и Ensembles. Они используют более разумный подход к идентификации данных, что означает, что вы можете избежать всего шага дедупликации. (Раскрытие информации: я разрабатываю ансамбли)

person Drew McCormack    schedule 14.02.2014
comment
Я согласен. Вышеупомянутое предложение Дункана удобно, но iCloud действительно не дает никаких гарантий относительно того, загрузило ли другое устройство свои обновления и все ли обновления были загружены другим устройством. - person David Carney; 18.02.2014
comment
Кроме того, спасибо за информацию об ансамблях. Я проверил TICDS, но он мне не понравился, потому что данные по-прежнему поддерживаются хранилищем SQLite, внутренности которого являются частью частного API Apple. - person David Carney; 18.02.2014

выполните запрос метаданных к файлам iCloud и проверьте самый последний файл журнала транзакций в iCloud. См. приведенную ниже ссылку на пример приложения, в котором используется этот подход для проверки правильности синхронизации приложения с iCloud.
http://ossh.com.au/design-and-technology/software-development/sample-library-style-ios-core-data-app-with-icloud-integration/

РЕДАКТИРОВАТЬ: я только что понял, что не получаю фактическое имя устройства, но как только вы найдете самый последний файл журнала, используйте его, чтобы получить устройство. Просто имейте в виду, что этот звонок может быть дорогим.

NSFileVersion *openedVersion = [NSFileVersion currentVersionOfItemAtURL:fileURL];
    return openedVersion.localizedNameOfSavingComputer;
person Duncan Groenewald    schedule 14.02.2014