0

在我的 NSPersistentDocument 子类中,我覆盖了这个函数:

func writeToURL(absoluteURL: NSURL, ofType typeName: FileType, 
               forSaveOperation saveOperation: NSSaveOperationType, 
               originalContentsURL absoluteOriginalContentsURL: NSURL?) throws

我阅读了文档、头文件以及我在网上可以找到的任何内容。但我不完全明白我应该在这里做什么。我知道到目前为止我遇到了很多崩溃和奇怪的行为。我认为这与 NSPersistentDocument 使用错误的持久存储文件有关。

所以我这样做是为了看看会发生什么:

  1. 启动应用程序,
  2. 打开一个新文档,
  3. 等待它执行自动保存(AutosaveElsewhereOperation),然后
  4. 复制文件,并且
  5. 等待两个文档自动保存。

在函数开始时,我打印各种 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(数据被复制,持久存储不变)还是替换我的存储(当前存储从持久存储协调器中删除,添加新存储)。

澄清一下:如果我什么都不做,两个文档都使用同一个文件,而一个文档使用了错误的文件。重复文档的信息/存储错误。如果我迁移,则原始文档具有错误的信息或持久存储。

4

0 回答 0