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