0

私のViewControllerでは、インターネットからいくつかのpngファイルをダウンロードし、それらをUIScrollViewに追加するUIImageViewsに追加しています。

ただし、ユーザーがナビゲーション バーの [戻る] ボタンを押すと、バックグラウンド スレッドがまだそれらのファイルのダウンロードを続行していることに気付きました。また、その結果、メモリが急増していることに気付きました。オブジェクトが適切に解放されていないと思います。

ユーザーがナビゲーション バーを押したときにすべてのスレッドを閉じるにはどうすればよいですか? xcode 4.2.1、ARC

ありがとう!

編集 -- 以下は for ループにあります

NSURL* url = [[NSURL alloc] initWithString:[@"someurl"]];
NSData* imageData = [[NSData alloc]initWithContentsOfURL:url];
UIImage* image = [[UIImage alloc] initWithData:imageData];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
imageView.frame = aFrame;
[self.screenshots addSubview:imageView]
4

3 に答える 3

2

ViewControllerでダウンロードを実行しないでください。それが問題の原因です。データをモデルクラスに移動します。ここですべてのダウンロードとデータ管理を行います。ビューコントローラは、モデルからデータを取得してビューに提供するだけです。ビューコントローラは、ネットワークからデータをフェッチする責任を負いません。あなたが発見したように、それらはいつでも消えることができます。

ダウンロードを中止して、誰かが画面間を移動するたびにダウンロードを再開したくはありません。モデルクラスにデータが必要であることを知らせ(ユーザーが画面に表示されたため)、次にモデルクラスに通知を投稿(またはKVO変更通知を提供)して、ビューコントローラーに新しいことを知らせます。データが読み込まれます。

于 2012-07-24T03:16:29.950 に答える
1

NSOperationQueue を検討し、新しいダウンロード操作を追加することをお勧めします。NSURLConnection を追加し、NSOperationQueue の供給を追加します。一度に複数のソースをダウンロードし、必要に応じて一度にすべての操作をキャンセルできます。また、一度にダウンロードする数などを設定することもできます。

于 2012-07-24T03:33:03.437 に答える
0

これを試して:

forループで、ダウンロードが不要になったときにダウンロードを停止する条件を作成します。

クラス変数を宣言するか、適切に

BOOL stopDownloading;

ダウンロードを開始するときに false に設定します。

stopDownloading = NO;

NOに設定するとforループが停止するように変更します。

if (!stopDownloading) {
    NSURL* url = [[NSURL alloc] initWithString:[@"someurl"]];
    NSData* imageData = [[NSData alloc]initWithContentsOfURL:url];
    UIImage* image = [[UIImage alloc] initWithData:imageData];
    UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
    imageView.frame = aFrame;
    [self.screenshots addSubview:imageView];
}

だから今、戻るボタンが押されたときに設定します

stopDownloading = YES;

それ以降のダウンロードはすべて停止しますが、セットアップが原因で、現在ダウンロード中のダウンロードを停止する方法がすぐにはわかりません (後続のダウンロードのみ)。この問題を解決するには、NSOperationQueue を作成し、ダウンロードごとに NSOperations を追加します。

または、さらに簡単に、 AFNetworkingなどの既存のオープン ソース ソリューションを使用します。具体的には、次の 2 つです。

AFImageRequestOperation 画像をダウンロードして処理するための AFHTTPRequestOperation のサブクラス。

UIImageView+AFNetworkingUIImageView URL からリモート画像を非同期的にロードするための メソッドを追加します。

于 2012-07-24T03:00:41.257 に答える