存続期間の終わりにオブジェクトから遅延後にデリゲートのメソッドを呼び出す
-
12-09-2019 - |
質問
独自のコンテキストでコアデータの変更を作成するモーダルビューコントローラーがあり、[完了]をクリックすると、変更が保存され(マージ変更通知が送信されます)、デリゲートに通知して閉じられます。
私の問題は、メインコンテキストが編集コンテキストの変更とマージされた後、デリゲートがメッセージを受信する必要があることです。デリゲート呼び出しを次の実行ループで実行したいのですが、オブジェクトの有効期間に問題があります。私は次のことを考えました。
- に電話をかける
[delegate performSelector:withObject:afterDelay:]
ただし、そのメッセージは認識されないようです。私のデリゲートは、NSObject
ただし、遅延を伴う実行セレクターは含まれません。 - ビューコントローラーでメソッドを作成します。
informDelegateWithObject:
これはデリゲート メソッドを呼び出し、遅延後にそのメソッドを呼び出します。つまり、[self performSelector:@selector(informDelegateWithObject:) withObject:.. afterDelay:..]
. 。ただし、ビュー コントローラーが閉じられているため、これは機能する可能性があります。遅延が数秒であれば、ビュー コントローラーはメモリから解放されており、呼び出すときにクラッシュが発生することはありませんか? - のインスタンスを作成します
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のだろう。