0

特定の機能を実装するための最良の方法を知りたいです。ユーザーが作成するメッセージコンポーザービューがありますNSManagedObject MessageObjectObjectHelperグローバルインスタンスが初期化されたクラスもあります。

ユーザーが作成ビューに入るとすぐにバックグラウンド(プライベートキュー)NSManagedObjectContextを作成します。MessageObjectここでの注意点は、ObjectHelper( ComposerViewControllerではなく)がこの新しいオブジェクトの所有者であるということです。これには、強力な参照を持つプロパティ変数があります。

ObjectHelper.h:

@property(nonatomic, strong) MessageObject *newObject;

次に、ComposeViewControllerタイマーを設定して、オブジェクトを30秒ごとにディスクに保存します(これにより、自動保存などのドラフトが保存されます。ユーザーが何らかの理由で中断されたり、アプリケーションがクラッシュしたりした場合でも、データは消去されません。 )。

次に、ユーザーが保存ボタンを押したときに、モーダルビューのアニメーションをスムーズに閉じ、関数がメインビューコントローラーにすばやく戻るように、メインスレッドでの作業をできるだけ少なくしたいと思います。したがって、私が行うことはNSDictionary、メッセージオブジェクトのすべての値を使用してを作成することです。[globalObjectHelperInstance updateNewObjectInstanceWithDictionary:]

newObjectこれは、作成ビューの最初に作成されたインスタンスをディクショナリの値で更新し、バックグラウンドスレッドで更新します。

それから私はモーダルを却下します。

ここにいくつか質問があります(できる限り答えてください):

  1. でプロパティインスタンスを作成するよりも、「ドラフト」保存機能を実装するためのより良い方法はありますObjectHelperか?(以外の外部クラスでプロパティインスタンスを作成する理由はComposeController、オブジェクトでバックグラウンド作業が行われているときにView Controllerが閉じられるため、インスタンス変数にするとメモリから消えてしまうのではないかと心配しています。)

  2. プロパティ参照は弱いか強いか?NSManagedObjectContext(私が思うに)これらのオブジェクトに保留中の未保存の変更がない限り、はそのオブジェクトを保持することが保証されていないことを私は知っています。

  3. 何らかの理由で、保存[backgroundMOC obtainPermanentIDsForObjects:self.newObject error:&error]する[globalObjectHelperInstance updateNewObjectInstanceWithDictionary:]前に呼び出すと、EXC_BAD_ACCESSがクラッシュします。これは、自分の状況でメモリを管理する方法と関係があると思います。

4

1 に答える 1

1
  1. ドラフトを保存するあなたの方法は私にはとても良いようです。

    もう1つのオプションは、プロパティ参照をオブジェクトに保持せず、ドラフトオブジェクトを何らかのキーでフェッチし、更新して再度保存することです。これは、何かをめったに保存しない場合や非常に大きなものがある場合に意味がありますが、現在のアプローチの方がはるかに適しているようです。

  2. 参照は強力である必要があります。あなたはそれを更新したい間は常に存在していることを望みます、そしてあなたはそれが存在することを要求します、それでそれは強い資格があります。弱参照の場合、オブジェクトが削除される可能性があります。ディスク上のデータベース内のオブジェクトは残りますが、メモリ内の表現は削除されます。これは望ましくありません。nil参照を更新するためです。

    これがメモリの過剰使用やリークを引き起こす可能性がある理由はわかりません。これは1つのオブジェクトであり、循環参照を恐れるわけではありません。

  3. クラッシュに関しては、私にはわかりにくいですが、最初にメインスレッドのMOCでIDを取得してから、バックグラウンドMOCで使用する必要がありますか?NSDictionaryまた、スレッド境界間での転送は、よりも簡単なのでNSManagedObject、ドラフトを常にバックグラウンドMOCに保持する必要がありますか?

    次に、のコードupdateNewObjectInstanceWithDictionary:はバックグラウンドキューのGCDブロックを呼び出し、辞書を渡して保存します。

于 2012-07-03T19:28:33.757 に答える