1

私たちのアプリケーションには、実際にデータを入力するのに時間がかかる可能性のある、ネットワークでバックアップされたデータ ソースを持つ複数の UITableView があります。通常は次のようになります。

  1. ユーザーがビューをトリガーします。
  2. viewDidLoad で、ビューのデータソースが作成されます。
  3. モデルの -load メソッドが呼び出されます
  4. モデルは、データを取得するためにネットワーク リクエストを発行します ...
  5. リクエストが終了する前に、ユーザーはビューを取り消します。
  6. ビューの ViewWillDisappear、ViewDidDisappear、ViewDidUnload、および dealloc メソッドが呼び出されます。
  7. リクエストが終了します。残念ながら、テーブル ビューの全部または一部が失われているため、大混乱が生じます。

したがって、私たちの解決策は、データ ソースを適切に「破棄」し、未処理のネットワーク リクエストをキャンセルして、これが起こらないようにすることでした。私が持っている質問は次のとおりです。

  1. データ ソースを破棄する「適切な」方法は何ですか? それへのすべての参照を失い、未処理のネットワーク要求をキャンセルするために -dealloc を使用しますか?

  2. どこで壊すべきですか?ViewDidUnload で? 解放?

  3. 実際、同じ 2 つの質問がモデルにも当てはまります。モデルを破棄する正しい方法は何ですか? そしていつ?

これはネットワーク リクエストだけに適用されるわけではないことに注意してください。Geolocation を使用する別のビューがあり、Geolocation 完了ブロックが呼び出されるまでに、更新されるはずのビューがなくなってしまうことがあります。

ありがとう!

PS 追加の質問:

  1. UITableView の場合、UITableView の -dealloc が呼び出される前に、ビュー内の行の割り当てが解除される可能性はありますか? たとえば、ViewWillDisappear 時にそれらの割り当てが解除され、その後たまたま -dealloc の前にリクエストが終了した場合、リクエストがたまたま UITableView 行を更新しようとすると、大混乱が起こります。

それは理にかなっていますか?

4

1 に答える 1

1

Objective-c、C++、または Objective-C++ を使用していますか? obj-c (-) ではなく C++ 構文 (::) を使用したメソッドを参照しているため、お尋ねします。C++ 側が苦手です。

-dealloc通常、オブジェクトの割り当てが解除された (破棄された) ときに行う作業がある場合は、メソッドを実装します。そこでは、ネットワーク リクエストをキャンセルし、ファイル ハンドルなどの低レベル リソースを解放します。このメソッドは、インスタンスへの参照がなくなり、割り当てを解除する準備ができたときに、obj-c ランタイムによって自動的に呼び出されます。このメソッドを手動で呼び出す必要はありません。

一般的に受け入れられているパターンは、オブジェクトの処理が完了したら、オブジェクトへの強い参照を無効にし、ランタイムに割り当て解除を処理させることです。あらゆる場所 (ネットワーク、ファイル システム アクセス、GPS など) でこのパターンに従えば、作業は非常に簡単です。

于 2013-09-04T15:55:24.323 に答える