在我的NSPersistentDocument子类中,我覆盖了这个函数:
func writeToURL(absoluteURL: NSURL, ofType typeName: FileType,
forSaveOperation saveOperation: NSSaveOperationType,
originalContentsURL absoluteOriginalContentsURL: NSURL?) throws
我阅读了文档,标题文件以及我在网上找到的任何内容。 但我不完全明白我应该在这里做些什么。我知道到目前为止我遇到了很多崩溃和奇怪的行为。我认为它与使用错误的持久存储文件的NSPersistentDocument有关。
所以我这样做是为了看看会发生什么:
在功能开始时,我打印各种网址。
Swift.print("\n\nsaving \(saveOperation.description) \nfile:____\(self.fileURL) \nstore:___\(self.persistentStore?.URL) @ \n__________________\(absoluteURL) | \norginal: \(absoluteOriginalContentsURL)")
此代码用于自动保存。
case .AutosaveElsewhereOperation:
if self.persistentStore == nil //new store
{
let type = self.storageStoreTypeForFileType(typeName)
self.persistentStore = try self.addPersistentStore(type, atLocation: absoluteURL)
}
try self.save()
我得到以下输出
> did init nil => a new file was init'ed
>
> saving auto elsewhere => the file was autosaved for the first time
> file:____nil
> store:___nil
> _________.../Unsaved_Document.sqlite
> original:.../Unsaved_Document.sqlite
>
> did init nil => the duplicate file was init'ed
>
> saving auto elsewhere => a file was autosaved
> file:____nil
> store:.../Unsaved_Document.sqlite
> ______.../Unsaved_Document 2.sqlite
> orginal:./Unsaved_Document 2.
>
> saving auto elsewhere => a file was autosaved
> file:____nil
> store:___.../Unsaved_Document.sqlite
> _________.../Unsaved_Document 2.sqlite
> original: ../Unsaved_Document 2.sqlite
>
> saving auto elsewhere => a file was autosaved
> file:____nil
> store:.../Unsaved_Document.sqlite
> ______.../Unsaved_Document.sqlite
> orginal:./Unsaved_Document.sqlite.
>
>....
因此,在自动保存期间,我应该保存我的持久存储,或者,我想,将其迁移到新位置。如果appkit要我将商店迁移到新位置(因为例如文件是重复的),那么我希望absoluteOriginalContentsURL指向原始数据,而absoluteURL指向新位置。
然而,absoluteOriginalContentsURL和absoluteURL都始终相同。更糟糕的是,我的持久存储指向两个文档的相同文件(在磁盘上)。因此,如果我什么都不做,一个文档将覆盖另一个文档的数据。
但是从这个函数中我不知道是否要将我的商店复制到absoluteURL(复制数据,持久存储不变)或者替换我的商店(当前商店从持久存储协调器中删除,新商店被添加)。
澄清:如果我什么也不做,两个文档都使用同一个文件,一个文档使用错误的文件。重复文档具有错误的信息/存储。 如果我迁移,那么原始文档具有错误的信息或持久存储。