存続期間の終わりにオブジェクトから遅延後にデリゲートのメソッドを呼び出す

StackOverflow https://stackoverflow.com/questions/1845975

質問

独自のコンテキストでコアデータの変更を作成するモーダルビューコントローラーがあり、[完了]をクリックすると、変更が保存され(マージ変更通知が送信されます)、デリゲートに通知して閉じられます。

私の問題は、メインコンテキストが編集コンテキストの変更とマージされた後、デリゲートがメッセージを受信する必要があることです。デリゲート呼び出しを次の実行ループで実行したいのですが、オブジェクトの有効期間に問題があります。私は次のことを考えました。

  1. に電話をかける [delegate performSelector:withObject:afterDelay:] ただし、そのメッセージは認識されないようです。私のデリゲートは、 NSObject ただし、遅延を伴う実行セレクターは含まれません。
  2. ビューコントローラーでメソッドを作成します。 informDelegateWithObject: これはデリゲート メソッドを呼び出し、遅延後にそのメソッドを呼び出します。つまり、 [self performSelector:@selector(informDelegateWithObject:) withObject:.. afterDelay:..]. 。ただし、ビュー コントローラーが閉じられているため、これは機能する可能性があります。遅延が数秒であれば、ビュー コントローラーはメモリから解放されており、呼び出すときにクラッシュが発生することはありませんか?
  3. のインスタンスを作成します NSInvocation. 。そこで考えたのですが、この物の寿命はどのくらいなのでしょうか?を使用して作成した場合 [NSInvocation invocationWithMethodSignature:] そうすれば、 NSInvocation オブジェクトは自動解放され、次の実行ループには存在しませんか?ましてや数秒。また、モーダル ビュー コントローラーが閉じられて解放されるため、ビュー コントローラーに呼び出しオブジェクトを保存できません。

助言がありますか?

役に立ちましたか?

解決

あなたは、デリゲートにコンテキストをマージする必要があります。

あなたはあなたの中にモーダルコントローラを保存押すと言う:didFinishSaving:あなたはmyViewControllerをお送りします。デリゲートに

myViewControllerにこのデリゲート:didFinishSaving:実装は、保存マージおよびモーダルビューコントローラを閉じます。

私はあなたの問題を理解している願っています。 さようなら! :)

他のヒント

あなたはmuccyが記述するラインに沿って動作するAppleのコアデータのBooksチュートリアルで見えるかもしれません。モーダルビューが却下され、制御が親ビューコントローラに返された後の保存が行われます。親は(つまり、他の場所でデリゲートに起こるかどうか)変更をマージするために必要な更新コードや火災の通知が含まれています。

#1の質問:performSelector:withObject:afterDelay:は、NSObjectクラスではなく、NSObjectのプロトコルで定義されています。使用している任意のオブジェクトは、おそらくNSObjectのインスタンスです。おそらく、コンパイラにを参照警告している。の静的型チェックの結果。 (技術的には、それがNSObjectのではないとNSObjectのプロトコルに準拠したオブジェクトのことが可能です。NSProxyは一例であり、しかし、あなたが通常使用するすべてのオブジェクトはNSObjectのだろう。。)あなたはあなたができる、Objective-Cで(この警告を無視することができます)任意のオブジェクトに任意のメッセージを送信しよう。それとも、あなたがしたい場合、あなたはid(あなたが任意の警告なしに任意のメッセージを送信することを可能にする)またはNSObject *のいずれかにキャストすることができます。

#2を質問へ:「遅延は数秒であるならば、それはメモリから解放されていたであろう」いいえ、performSelector:withObject:afterDelay:のドキュメントには、「このメソッドは、セレクタが行われた後まで、受信機とanArgumentパラメータを保持しています。」と言います

また、このようなあなたのデリゲートを宣言することができます:

    NSObject <MyClassDelegateProtocol> *delegate;

次に、あなたのデリゲートはまたあなたのプロトコルに準拠NSObjectのだろう。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top