Я работаю над своим первым «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 должен будет заново создать / заново открыть документ после того, как он будет снова запущен. Что должно произойти в этом случае?
Я провел несколько тестов, но результат не всегда был одинаковым. В некоторых случаях документ начинался со своей «старой» версии и затем получал уведомление с изменениями. В других случаях документ начинался прямо в новой версии со всеми изменениями на борту. Для моего приложения первый случай (начать со старой версии, получать уведомление об обновлении) был бы лучше, но я не смог заставить то или другое поведение. Это должно было работать?
Большое спасибо!