CoreData с автосохранением сохраняется в первый раз, затем вылетает с NoSuchFileError при всех последующих автосохранениях

Приложение на основе NSDocument с использованием CoreData. Очень просто — две сущности с отношением «один ко многим». Это приложение отлично работает с сохранением, загрузкой и т. д.

Затем я включил автосохранение следующим образом:

[[NSDocumentController sharedDocumentController] setAutosavingDelay:0.1];

...и тут же все пошло не так.

Первое автосохранение работает, 100% правильно. т. е. он сохраняет файл в личном каталоге пользователя, и если вы выходите из приложения и перезапускаете его, автоматически повторно открывается автоматически сохраненный документ. Прохладный!

Но как только вы делаете второе изменение данных, вы получаете сбой в автосохранении, с этим:

error = Error Domain=NSCocoaErrorDomain Code=134030 UserInfo=0x1001a1be0 "An error occurred while saving."
 Underlying Error=(Error Domain=NSCocoaErrorDomain Code=4 UserInfo=0x10019a840 "The file doesn’t exist."
 Underlying Error=(Error Domain=NSPOSIXErrorDomain Code=2 UserInfo=0x100150d00 "The operation couldn’t be completed. No such file or directory"))

... что не имеет смысла для меня. Почему auto*SAVE* заботится о том, существует файл или нет? Почему это сработает в первый раз, а затем не сработает в последующие разы?

NB: Я проверил, и Apple пытается использовать идентичное имя файла при втором вызове автосохранения - если это сработало в первый раз, почему это не удалось через 0,5 секунды ???


person Adam    schedule 08.05.2011    source источник


Ответы (2)


Почему вы пытаетесь автоматически сохраняться десять раз в секунду? Это ОЧЕНЬ часто. Сохранение файла может занять больше одной десятой секунды. Более разумным значением было бы 10 секунд, и это, вероятно, чаще, чем на самом деле необходимо.

person Rob Keniger    schedule 09.05.2011
comment
Насколько я понимаю, документы таковы, что во время сохранения они не будут автоматически сохраняться снова (если только некоторые данные не будут изменены при сохранении?). 0,1 секунды должны были ускорить тестирование / отладку, и я предположил, что это не повлияет на то, работает ли сохранение или нет - вы думаете, что это причина? - person Adam; 09.05.2011

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

Из NSPersistentDocument (подкласс NSDocument, который используется при выборе Core Data и NSDocument во время создания проекта):

«Сохранить в…» и автосохранение напрямую не поддерживаются — основные данные не могут сохраняться в хранилище и сохранять то же измененное состояние в контексте управляемого объекта, сохраняя при этом несохраненный стек в качестве текущего документа.

Интересное утверждение, что "Core Data не может..." - конечно, CD "может" это сделать, хотя я вижу, что это, вероятно, много кода и прыжков через обручи, чтобы заставить его работать. Больше похоже на оправдание, чем на объяснение.

person Adam    schedule 16.05.2011