2009-09-30 2 views
12

Я работаю над приложениями Core Data, основанными на документах.Автосохранение с данными какао и ядра

Я бы хотел, чтобы изменения были сохранены по мере их возникновения. Это то, чего ожидает пользователь в этом типе приложения. Это также то, что Apple внедрила в iPhoto или iTunes.

Подход, основанный на грубой силе, заключается в том, чтобы настроить таймер для сохранения часто. Метод, вызванный сохранением, затем проглотит все ошибки проверки, чтобы не беспокоить пользователя. Только после выхода из системы пользователь будет прослушивать данные, чтобы сохранить их. ИМХО, этот подход воняет.

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

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

+0

Если вы уже поддерживаете отмену, просто сохраните ее каждый раз, когда вы нажимаете что-то на стопку отмены. –

+0

Я еще не поддерживаю Отменить. Я использую только то, что предоставляет CoreData. Но вы делаете сильный аргумент в пользу расширенной поддержки Undo. –

ответ

14

В конце каждого события в приложении AppKit CoreData будет запускать для вас -processPendingTransactions.

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

Так, например, в обработчике уведомлений вы можете просто сказать контекст для сохранения.

Однако вы можете быть параноиком относительно сохранения контекста во время обратного вызова из того же контекста, так что вам, вероятно, будет лучше, если вы выполнили функциюSelector: @selector (save :) afterDelay: нажать сохраняйте до тех пор, пока не будет выполнена операция -processPendingTransactions.

Вы можете даже отменить предыдущий вариант на -save: селектор и иметь задержку как 5 секунд, поэтому, если пользователь или приложение находится в середине BUNCH изменений, все они будут объединены в одно сохранение ,

И, фактически, именно так работала Delicious Library 1.0-1.09.

-Wil

+0

Спасибо за подсказку. Как ваше предложение, так и идея увязки с менеджером отмены выглядят превосходно. Конечно, ваш комментарий задает вопрос: почему последние версии Delicious Library больше не используют эту технику? –

+0

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

+0

Итак, вы все еще вызываете функцию performSelector: @selector (save :) afterDelay: вообще или вы используете какой-либо другой метод для автосохранения контекста? –