UIManagedDocument + iCloud "Большая картинка"? - PullRequest
4 голосов
/ 27 марта 2012

Я работаю над своим первым «iCloud App». Я работал с документами Apple и видео из Стэнфорда, но я все еще пытаюсь понять «большую картину» iCloud.

Моя цель - создать приложение " Library style " (которое является термином "Яблоки" для приложения с "одним стеком базовых данных с одним постоянным координатором хранилища и одним постоянным хранилищем"), как Пример сотрудников .

После видео из Стэнфорда я использую UIMangedDocument для настройки всех компонентов Core Data и включения возможностей iCloud. UIMangedDocument содержит базу данных и «хранится в облаке».

Это уже первое, с чем я борюсь: Что на самом деле означает "хранится в облаке"?

До того, как я начал работать с iCloud, я думал, что "хранить документ в облаке" означало бы "хранить копию документа в облаке". Я думал, что в обычной песочнице будет локальная версия моего документа и копия документа в облаке. При изменении локального документа эти изменения также переносятся в облачную версию. Как я понимаю, сейчас это не правильно (по крайней мере, не совсем правильно). Я прав?

Первое, что я должен сделать, чтобы использовать iCloud, это вызвать URLForUbiquityContainerIdentifier: . Это вернет «URL-адрес iCloud», который означает URL-адрес папки в облаке. Все файлы, которые хранятся по этому URL, будут «храниться в облаке», верно?

Мое первое предположение (локальный файл + копия в облаке) не совсем неверно. Фактически существует «локальная версия» и «облачная версия» любого файла, хранящегося в облаке. Это связано с тем, что я могу получить доступ к URL-адресу iCloud и хранить файлы в этом месте, даже если устройство в настоящее время не подключено к Интернету. Но это только за магией фреймворка iCloud, и мне не о чем беспокоиться. С моей точки зрения, облако - это просто специальная папка, и любой файл или каталог в этой папке хранится в облаке. URL-адрес iCloud будет равен NIL, если iCloud отключен в настройках устройства. Это верно?

Второе, с чем я борюсь, это как iCloud синхронизирует изменения в документе. Предположим, что «TheApp» на устройстве A создает UIManagedDocument и сохраняет в облаке. После этого устройство А переходит в автономный режим. Тем временем TheApp получает доступ к документу на устройстве B, и некоторые данные добавляются (например, вставляются некоторые новые сотрудники или отделы). Когда устройство B снова подключится к сети, оно получит NSPersistentStoreDidImportUbiquitousContentChangesNotification и может объединить все вызовы mergeChangesFromContextDidSaveNotification: в managedObjectContext документа для копирования этих изменений.

Мне не удалось выяснить, действительно ли необходимо объединить изменения. Как описано выше, с моей точки зрения, существует только один Документ. Если это правда, то хорошо, что меня уведомили об изменениях, но нет необходимости копировать эти изменения в «локальную версию» документа, потому что не существует такой вещи, как «локальная версия». Это приводит меня к вопросу о том, что mergeChangesFromContextDidSaveNotification: подходит для.

Другой сценарий был бы такой же, как и раньше (документ, созданный на устройстве A, измененный на устройстве B ...), но теперь устройство A было не просто отключено, а TheApp было полностью отключено, в то время как изменения были сделаны на устройстве B. В этом случае TheApp на устройстве A должен будет заново создать / заново открыть документ после того, как он будет снова запущен. Что должно произойти в этом случае?

Я провел несколько тестов, но результат не всегда был одинаковым. В некоторых случаях документ начинался со своей «старой» версии и затем получал уведомление с изменениями. В других случаях документ начинался прямо в новой версии со всеми изменениями на борту. Для моего приложения первый случай (начать со старой версии, получать уведомление об обновлении) был бы лучше, но я не смог заставить то или другое поведение. Это должно было работать?

Большое спасибо!

Ответы [ 2 ]

1 голос
/ 02 марта 2013

Как правило, я могу порекомендовать прочитать Руководство по проектированию iCloud - в частности, раздел "Проектирование документов в iCloud" .

Что касается ваших вопросов:

  • Что на самом деле означает «хранится в облаке»?

    Если вы используете UIManagedDocument после видео из Стэнфорда, ваше приложение будет загружать журналы измененийкогда данные добавляются / редактируются / удаляются.Однако у вашего устройства есть своего рода «кэш iCloud», в котором оно хранит данные iCloud и получает к ним доступ (у вас есть доступ к этой папке, когда вы находитесь в автономном режиме или даже когда ваше приложение удалено и переустановлено).Если вы NSLog URL-адреса документов в вашей папке iCloud (вы должны сделать это с NSMetadataQuery, вы получите путь к файлам iCloud локально на вашем устройстве, который равен

    /private/var/mobile/Library/Mobile Documents/<Developer identifier>/<App identifier>/...

    По этой причине вам нужно подумать о множестве вещей при доступе к вашим документам пользовательского интерфейса (управляемым) в iCloud при первом запуске приложения или при каждом запуске приложения (например, доступен ли iCloud, есть ли у вас сетевое подключение), ...).

    Однако, следуя видео, у вас не будет отдельных документов в изолированной программной среде вашего приложения и в iCloud (этого можно достичь, конечно, при сохранении документа для создания в iCloud.URL-адрес, а также локальный URL-адрес в изолированной программной среде приложения).

  • Необходимость объединения изменений

    Как описано выше, ваши устройствасохранение журналов изменений, которые включают добавления / изменения / удаления в ваш документ. Эти журналы изменений загружаются в iCloud и загружаются другими устройствами, подключенными к той же учетной записи iCloud. Каждое устройство можетВосстановите текущее состояние вашей модели данных с помощью журналов изменений.Это делает iCloud чрезвычайно эффективным (полная загрузка в каждый раз займет гораздо больше времени).Что касается процесса синхронизации этих изменений, я также могу обратиться к Руководству по проектированию iCloud.Короче говоря, вам придется думать о том, чтобы ваше устройство синхронизировало локальную папку iCloud каждый раз, когда оно возвращается в онлайн-режим.

0 голосов
/ 09 февраля 2014

Для тех, кто все еще борется, попробуйте этот сайт.

http://ossh.com.au/design-and-technology/software-development/

Существуют примеры приложений для iOS и OSX, которые включают интеграцию iCloud, резервные копии, статус синхронизации iCloud и т. Д.

...