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 にコピーする (データはコピーされ、永続ストアは変更されません) か、ストアを置き換える (現在のストアは永続ストア コーディネーターから削除され、新しいストアが追加されます) かわかりません。
明確にするために:何もしないと、両方のドキュメントが同じファイルを使用し、一方のドキュメントが間違ったファイルを使用しています。重複したドキュメントの情報/ストアが間違っています。移行すると、元のドキュメントに間違った情報または永続ストアが含まれます。