5

私はビューコントローラAとビューコントローラBを持っているとします。iOS:バックグラウンドジョブを実行してからView Controllerを終了するとどうなりますか?

VC Aでは、私はVC Bを押します。次にVC Bでは、NSOperationを使っていくつかのバックグラウンドタスクを実行します。バックグラウンドタスクでは、VC Bの変数を変更します。

バックグラウンドタスクが完了せず、VC Bを終了するとどうなりますか?操作はキャンセルされるか、それともまだ実行されますか?デバッグ時には、まだ実行中のようです。その場合、私はVC Bをやめたので、すでにリリースされている変数にアクセスしていないでしょうか?

私はこれで少し混乱しています、誰も私をきれいにすることができますか? :)

おかげで、

+0

その回クイックテストは質問するよりも –

答えて

4

あなたは正しいですが、操作は魔法のそれを生み出したオブジェクトがしたからといって消えることはありません。

現在、割り当て解除されたビューコントローラオブジェクトにアクセスしようとすると、OSに例外がスローされます。これはバックグラウンドのスレッド操作を行う危険性があります。

この場合、VC Bの割り当てが解除されたときに操作をキャンセルできるようにする必要があります。これは、NSOperationのサブクラス化、main()の実装、isCancelledのチェックを意味します。

NSOperation、NSOperationQueues、およびConcurrency Programmingについては、Appleのマニュアルを参照してください。ドキュメントから

1

あなたがキューに操作を追加すると、操作はあなたの手の外にあります。キューは、そのタスクのスケジューリングを処理して処理します。

操作が実行されている間、それは割り当てを解除することができれば理想的には、直接あなたのVCの変数を変更するべきではありませんが、結果を計算して、コールバックを行う必要があります。 ARCを使用している場合は、View Controllerに対する弱い参照を保つことができ、VCが割り当て解除されても参照することは安全です。

同時実行を実装する場合は、Grand Central Dispatchとブロックを使用して調べることをおすすめします。これは、ブロックが必要に応じてブロック内で参照する変数をカプセル化して保持するようになり、設定と実行がずっと簡単になり、よりクリーンなコードを作成できるようになります。

4

VC-Bの目的とバックグラウンドアクティビティの目的を考慮するとよいでしょう。バックグラウンドアクティビティがVC-Bでユーザが見るものをサポートするために存在し、ユーザがVC-Bから離れるとき、バックグラウンドアクティビティはもはや関連性がなくなり、VC-Bを離れるとバックグラウンドアクティビティが終了するはずである。他方、バックグラウンド活動がVC-Bより大きい目的を有する場合、ユーザはそれらが継続することを期待する。このケースでは、活動を管理するための「比較的永続的/長命の」オブジェクト(バックグラウンド・マネージャー)にはおそらく適切です。後者の場合、VCは必要に応じてバックグラウンドマネージャと対話する。

ので(それがあるべきように)がダウンし、あなたを行う(そしてもっと重要なのは、ユーザーが何を)/欲しい期待に付属しています...アップコーディングするほとんど容易であること、このような

関連する問題