在NSPersistentDocument中自动保存:两个文档使用相同的持久存储文件

时间:2016-03-04 18:40:03

标签: cocoa core-data nsdocument autosave nspersistentdocument

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

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

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

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

  1. 启动应用
  2. 打开一个新文档,
  3. 等待它进行自动保存(AutosaveElsewhereOperation),然后
  4. 复制文档,
  5. 等待两个文件自动保存。
  6. 在功能开始时,我打印各种网址。

    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(复制数据,持久存储不变)或者替换我的商店(当前商店从持久存储协调器中删除,新商店被添加)。

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

0 个答案:

没有答案