2014-02-18 1 views
0

В настоящее время я работаю над приложением, которое является документом, основанным как на OS X, так и на iOS, и использует Core Data. Чтобы сделать документы одинаковыми на двух платформах, я использую BSManagedDocument со стороны OS X.Как обнаружить изменения в документе Core Data в iCloud на OS X до перезагрузки документа?

Если я запускаю приложение на обеих платформах одновременно и открываю один и тот же документ в каждом, я могу вносить изменения со стороны OS X и получать два уведомления на стороне iOS (один, когда состояние документа переходит к отключению редактирования, а одно, когда он возвращается к норме). Я могу легко использовать второй в качестве триггера для обновления пользовательского интерфейса, позволяющего стороне iOS работать должным образом.

Проблема в том, что я вношу изменения на стороне iOS. Когда это произойдет, окно документа снова открывается (я подтвердил, что вызывается windowControllerDidLoadNib:). В простом приложении это всего лишь икота (хотя она должна быть удалена), в то время как в более сложных приложениях я видел этот результат только в частичной перерисовке содержимого окна.

Я пробовал зарегистрироваться для NSPersistentStoreDidImportUbiquitousContentChangesNotification, но это уведомление никогда не происходит на обеих платформах.

Есть ли вообще какой-либо смысл в OS X сообщать, что изменения произошли из iCloud, чтобы в пользовательский интерфейс могли вноситься необходимые обновления, а затем предотвратить повторное открытие окна?

+0

Я подал DTS для этого. Если я получу ответ, который может быть разделен, я добавлю ответ, чтобы никто другой не мог записать DTS. – theMikeSwan

ответ

0

Непонятно, из-за вашего описания, используете ли вы iCloud для синхронизации журналов транзакций или размещаете ли вы весь документ в iCloud и синхронизируете документ. Если вы используете журналы транзакций для синхронизации документов, тогда неясно, что такое уведомление об отключении редактирования - это не то, что полезно для синхронизации журнала транзакций. Для последнего вы должны открыть магазин с установленной опцией NSPersistentStoreUbiquityNameKey, и это приведет к тому, что Core Data создаст журналы транзакций в iCloud и импортирует журналы с других устройств. Затем вы должны получить импортные уведомления.

Быстрая проверка в контейнере iCloud должна подтвердить, какой подход вы используете. Если вы используете журналы транзакций, то контейнер iCloud должен выглядеть примерно так: enter image description here

Возможно, вы захотите ознакомиться со ссылкой ниже, где я разместил более подробные описания того, как создавать приложения на основе документов. http://ossh.com.au/design-and-technology/software-development/.

К сожалению, примеры приложений не основаны на UIManagedDocument или NSPersistentDocument, но если вы посмотрите, как они обрабатывают файлы резервных копий, вы, вероятно, можете использовать этот подход для создания приложения на основе документов с меньшими затратами, чем с помощью UIManagedDocument.

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

+0

Я нашел метод 'presentationItemDidChange' в протоколе' NSFilePresenter', который сообщает мне, когда документ был изменен на диске, и если я его перехватил без вызова супер, окно не будет повторно открываться. Я уверен, что есть много другого поведения, которое мне придется дублировать, если я останусь на этом пути. Я посмотрю вашу ссылку, чтобы увидеть, есть ли лучшие идеи, которые я могу включить оттуда. Самая большая проблема заключается в том, что документы хранятся в /Documents, поэтому пользователь может удалить их отдельно за пределами приложения. – theMikeSwan

Смежные вопросы