問題タブ [nspersistentdocument]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
swift - XCTestCase で NSPersistentDocument をテストするには?
Core Data を使用して OS X ドキュメントベースのアプリを開始しています。モデルの関係をテストするために、いくつかの NSManagedObject エンティティを作成し、それらをファイルに保存して、XCTestCase オブジェクトで読み返したいと考えています。以下のようなコードを使用して、管理対象オブジェクト コンテキストでエンティティを作成できますが、機能する永続ストア コーディネーターを作成する方法やファイルに保存する方法がわかりません。
swift - NSPersistentDocument: バージョンの参照: 読み取り専用ファイルを追加しようとしています
カスタム コア データ スタックを使用しているため、関数init, readFromURL, writeToURL
とrevertToContentsOfURL
関数を上書きしています。
[すべてのバージョンを参照] をクリックすると、以前のバージョンのファイルがオープンエンドになり、init が呼び出されます。ただし、次のエラーが表示されます。
読み取り専用ファイルをパスに追加しようとしています...代わりに読み取り専用で追加します。
これは、将来的には重大なエラーになります。
NSReadOnlyPersistentStoreOption を指定する必要があります。
私の質問は次のとおりです。開いているファイルが通常のファイルかバージョン付きファイルかをどのように知ることができますか?
cocoa - NSPersistentDocument の自動保存: 2 つのドキュメントが同じ永続ストア ファイルを使用しています
NSPersistentDocument のサブクラスで、この関数を上書きします。
ドキュメント、ヘッダー ファイルなど、オンラインで見つけたものはすべて読みました。しかし、私はここで何をすべきかを完全には理解していません。これまでのところ、多くのクラッシュや奇妙な動作が発生することを知っています。間違った永続ストア ファイルを使用している NSPersistentDocument に関係していると思います。
だから私は何が起こるかを見るためにこれをします:
- アプリを起動し、
- 新しいドキュメントを開き、
- 自動保存 (AutosaveElsewhereOperation) が実行されるのを待ってから、
- ドキュメントを複製し、
- 両方のドキュメントが自動保存されるまで待ちます。
関数の開始時に、さまざまな URL を出力します。
このコードは自動保存に使用されます。
次の出力が得られます
したがって、自動保存中に永続ストアを保存するか、新しい場所に移行する必要があります。appkit がストアを新しい場所に移行することを要求する場合 (ファイルが複製されたなどの理由で)、absoluteOriginalContentsURL が元のデータを指し、absoluteURL が新しい場所を指すことを期待します。
ただし、absoluteOriginalContentsURL と absoluteURL は常に同じです。さらに悪いことに、私の永続ストアは、両方のドキュメントに対して (ディスク上の) 同じファイルを指しています。したがって、何もしなければ、一方の文書が他方の文書のデータを上書きしてしまいます。
しかし、この関数内からは、ストアを absoluteURL にコピーする (データはコピーされ、永続ストアは変更されません) か、ストアを置き換える (現在のストアは永続ストア コーディネーターから削除され、新しいストアが追加されます) かわかりません。
明確にするために:何もしないと、両方のドキュメントが同じファイルを使用し、一方のドキュメントが間違ったファイルを使用しています。重複したドキュメントの情報/ストアが間違っています。移行すると、元のドキュメントに間違った情報または永続ストアが含まれます。
core-data - コアデータに裏打ちされた NSTextView
1 つのタブに NSTextView を含む NSTabViewController があります。テキストはコア データに保存されます。ビューが消えたらテキストを保存します。
しかし、ドキュメント自体を閉じたときにテキストを保存するにはどうすればよいでしょうか? 現時点では、すべてのキーストロークを節約していますが、それはおそらくやり過ぎです。より良い方法はありますか?
編集:
macos - 「名前を付けて保存」で NSPersistentDocument がクラッシュする
Core Data ドキュメントベースのアプリケーションが「名前を付けて保存」時にクラッシュします。この問題は、cocoa-dev スレッド「NSPersistentDocument objects "gutted" after Duplicate, Rename in 10.9」で説明されている問題と似ているようです。
主な違いは次のとおりです。
- OS X 10.10 Yosemite をターゲットにして実行しています
- 複製ではなく「名前を付けて保存」を使用する
- クラッシュは以前に発生します。MOC 保存中
この問題は、最も単純な NSPersistentDocument にも影響します。少なくとも 2014 年から存在しています。したがって、他の人が同じ問題に遭遇し、共有したい回避策があることを願っています。
私のサンプル プロジェクトでは、単一の属性を持つ単一のエンティティを使用します。エンティティのすべてのインスタンスを表示するテーブル ビューと、新しいインスタンスを作成するためのボタンがあります。autosavesInPlace を無効にするためだけに、デフォルトのテンプレートから逸脱しました。
クラッシュを再現する手順は次のとおりです。
- Yosemite でビルドして実行します。このバグは El Capitan で修正されたようです
- 新しいドキュメントを作成する
- 新しいオブジェクトを挿入する
- ドキュメントを保存する
- ドキュメントを閉じる
- ドキュメントを再度開く
- テーブル内の属性の値を変更します
- 「名前を付けて保存」を使用して、新しい名前で保存します
OS X Yosemite では、これは常に次のバックトレースでクラッシュします。
編集 1. 考えられる回避策:
「名前を付けて保存」操作中に元の管理オブジェクト コンテキストが保存されないようにすることで、クラッシュを回避することができます。「名前を付けて保存」した後、すぐに既存のドキュメントを閉じ、新しい場所からドキュメントを再度開きます。それはすべて非常に醜く、他の NSPersistentDocument の動作を壊す可能性があります。
編集 2. 上記の回避策では、保存されていない変更が失われます
元の管理オブジェクト コンテキストが保存されないようにすることで、クラッシュを回避できます。ただし、最終結果は、最後に保存された状態のドキュメントのコピーです。保存されていない変更は失われます。
編集 3. 内臓スナップショット
古い管理対象オブジェクト コンテキストが変更を新しいファイルに保存しようとするまでに、オブジェクト スナップショットはそのエンティティを認識しなくなります<_CDSnapshot_Entity_: 0x600001f3cfd0> (entity: (null); id: 0x40000b <x-coredata://83B64FD3-B5B9-44CB-976D-54C0326FDFF5/Entity/p1> ; data: (null))
。インスタンス変数 backing が表示されません-[_CDSnapshot entity]
。オブジェクトIDからそれを見つけるべきだと思います。
swift - NSPersistentDocument、Swift、macOS、およびストーリーボード — managedObjectContext を取得する方法は?
xib と nib の時代に戻って、CoreData と macOS に取り組んでからしばらく経ちました。xib には、ドキュメントと managedObjectContext へのアクセスを許可できる「ファイルの所有者」があります。簡単。
NSPersistentDocument と私のストーリーボードでは、鶏が先か卵が先かという問題が少しあります。NSPersistentDocument からサブクラス化された私の Document クラスには、次のものがあります。
これは、Apple を含む多くの人々が提案しているようです。
私の問題はこれです: MainViewController では、オブジェクト コントローラーが必要で、それを managedObjectContext にバインドする必要がありますが、managedObjectContext が必要な場合は、presentedObject を self にまだ設定していません。したがって、例外がスローされます。makeWindowControllers メソッドの最後にpresentedObjectを設定するのは遅すぎますが、とにかく早く取得する方法がわかりません。