在我的 NSPersistentDocument 子类中,我覆盖了这个函数:
func writeToURL(absoluteURL: NSURL, ofType typeName: FileType,
forSaveOperation saveOperation: NSSaveOperationType,
originalContentsURL absoluteOriginalContentsURL: NSURL?) throws
我阅读了文档、头文件以及我在网上可以找到的任何内容。但我不完全明白我应该在这里做什么。我知道到目前为止我遇到了很多崩溃和奇怪的行为。我认为这与 NSPersistentDocument 使用错误的持久存储文件有关。
所以我这样做是为了看看会发生什么:
- 启动应用程序,
- 打开一个新文档,
- 等待它执行自动保存(AutosaveElsewhereOperation),然后
- 复制文件,并且
- 等待两个文档自动保存。
在函数开始时,我打印各种 URL。
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(数据被复制,持久存储不变)还是替换我的存储(当前存储从持久存储协调器中删除,添加新存储)。
澄清一下:如果我什么都不做,两个文档都使用同一个文件,而一个文档使用了错误的文件。重复文档的信息/存储错误。如果我迁移,则原始文档具有错误的信息或持久存储。