2

データ、アーカイブされたオブジェクト、および画像のパッケージにファイル ラッパーをカプセル化する UIDocument のカスタム サブクラスを実装する iOS アプリがあります。最初に実装を iCloud サポート用の UIDocument に変換しましたが、信頼性が低すぎるため、iCloud 部分を引き出して、ローカル ストレージで UIDocument を使用しています。

ユーザーがデータを変更すると、 updateChangeCount: を UIDocument インスタンスに送信し、バックグラウンドで定期的に自動保存します。アプリケーションがバックグラウンドになったときにのみドキュメントを閉じます。UIDocument の contentsForType メソッドを呼び出す自動保存の後、loadFromContents も呼び出されることを発見しました。これは論理的に理解できず、インターフェースにも問題を引き起こしています。

loadFromContents は、ドキュメントを開くとき、または iCloud ドキュメントが別のデバイスで変更された場合にのみ呼び出されると思いました。そのため、ドキュメントがバックグラウンドで自動保存されると、再読み込みも行われ、UI が更新され、保存されていない進行中の新しい作業が破棄されることがあります。UI での再読み込みを無視することもできますが、モデル データが UI オブジェクトと異なるという問題がいくつかあります。

では、この動作を引き起こすために何が間違っているのでしょうか? loadFromContents を開始しないように保存したり、その動作を処理する方法を理解したりしたいと思います。

ありがとう!

4

1 に答える 1

2

この動作は、変更が保存されていないドキュメントを閉じるときのクラッシュを防ぐために、初期実装で contentsForType メソッドと writeContents: メソッドをラップしたいくつかの @synchronized 呼び出しが原因であることがわかりました。不正なアクセス エラーの原因となった、contentsForType へのほぼ同時に 2 つの呼び出しを取得していました。

ドキュメントを閉じる前に updateChangeCount:UIDocumentChangeCleared を設定することで、これらのクラッシュを防ぐよりクリーンな方法を見つけました。

于 2012-12-13T22:50:44.840 に答える