2

私のコードは、initWithURL で IntentImage を初期化し、downloadImage を呼び出すことにより、メソッドでInternetImageを使用して画像を非同期的にダウンロードします。tableview: cellForRowAtIndexPath:このコードは、UITableView の新しいセル UITableViewCell まで下にスクロールした後は完全に実行されますが、どちらの場合も URL が正しいにもかかわらず、前には実行されません。InternetImage の NSURLConnection デリゲート メソッドは、接続の成功または失敗を通知するために呼び出されることはありません。reloadData:イメージのダウンロードに失敗したため、 、setNeedsDisplay:、および を呼び出しsetNeedsLayout:て何もしません。

UiTableViewController のサブクラスのコードは次のとおりです。

   - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        Object *object = (Object *)[self.array objectAtIndex:indexPath.row];

        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
        if (cell == nil) {
            cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"cell"] autorelease];
        }

        cell.textLabel.text = object.attribute;

        if (object.image == nil && object != nil) {
            NSString *URLString = [[MyAppDelegate imageURLFromLink:(object.link) withExtension:@".jpg"]absoluteString];

            InternetImage *asynchImage = [[InternetImage alloc] initWithUrl:URLString object:object];
            [asynchImage downloadImage:self];
        }

        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

        if (object.image != nil && object.thumbnailImage == nil) {

            UIImage *image= (UIImage *) object.image;
            UIImage *thumbnail = [image _imageScaledToSize:CGSizeMake(75.0, 50.0) interpolationQuality:20];
            object.thumbnailImage = thumbnail;
        }
        cell.imageView.image = object.thumbnailImage;

        return cell;
    }
4

7 に答える 7

1

実際、テーブルがスクロールしている限り、NSUrlConnectionsはデータを取得しないようです。スクロールが停止すると、すぐにデータの取得を続行します。ただし、この動作はどのiPhoneアプリケーションでも見られ(テーブルがスクロールしている限り画像は読み込まれません)、最終的には、アプリケーションでもこの動作を使用することにしました。Appleはこれを故意に行ったと思います。ユーザーが非常に高速にスクロールしている場合に、デバイスが大量の画像要求でサーバーを攻撃するのを防ぐためかもしれません。または、いつでもユーザーがスムーズにスクロールできるようにすることもできます。

ただし、少なくともゆっくりとスクロールしている間は機能し、速くスクロールしている間はダウンロードをブロックするだけでよいと思います。

于 2009-08-12T20:37:58.320 に答える
1

テーブルがロードされた後に画像がバックグラウンドでダウンロードされない理由を尋ねている場合は、 が画面上のセルでtableView:cellForRowAtIndexPath:のみ呼び出されるためです。indexPaths

セルが画面上を転がるときではなく、すべての画像を一度にダウンロードしたい場合は、arrayプロパティをループしてInternetImageオブジェクトをインスタンス化するメソッドを記述します。これが起こりそうな場所はviewDidLoad.

次に、UITableViewデリゲートに実装し、各セルのプロパティにtableView:willDisplayCell:forRowAtIndexPath:正しいオブジェクトを割り当てる責任を負わせます。InternetImageimageView

于 2009-08-08T06:08:15.417 に答える
0

答えはありませんが、同じような問題が発生していると言えます。

MarkJohnsonのAsyncImageViewクラスのわずかに変更されたバージョンを使用しています。テーブルビューをスクロールするまで、画像の非同期リクエストによってデリゲートが呼び出されることはありません。セルをスクロールしてビューから外し、元に戻すとすぐに、呼び出しが再度発生し、データが適切に取得されます。

NSURLConnectionが実行ループに依存して特定のモードになっていることを他の場所で読みました。これが、tableView:cellForIndexPathでURLConnection要求が開始された状況にあるかどうかはわかりません。

NSURLConnectionの内部をデバッグするにはどうすればよいですか?

[アップデート]

さて、メインスレッドで接続を明示的に開始することで、この問題の特定のインスタンスを解決しました。接続設定コードを別のセレクターに配置し、performSelectorOnMainThreadを介して呼び出したところ、すべてが再び良好でした。

接続を開始するセレクターに現在のランループモードを記録してみてください。これは、NSUrlConnectionが必要とするデフォルトのランループモードではないことがわかりました。

于 2009-10-15T18:16:18.140 に答える
0

いいアプローチ?まず、imageviewをどこに割り当てるかを確認しますか?2番目は、画像が固定されている場合は、コード全体ではなく特定のものを意味します

if(cell == nil)
{

}

その状態の側。私は同じ問題に直面し、このように解決しました。これが機能するかどうかを教えてください。

于 2009-08-08T12:14:43.093 に答える
0

私は実際にコードを見て時間を費やしました。

で、InternetImageこんな機能があることに気が付きました。あなたがしなければならないことは、この関数を取得しTableViewて「リフレッシュ」するように通知することです。後で呼び出されるデリゲート関数をクラスに渡すことでこれを行うことができますが、ここでは非常に複雑です。ビューを離れるときは、ダウンロードしようとしているすべての画像に対してデリゲート関数を「nil」に設定する必要があるためです。

-(void) internetImageReady:(InternetImage*)downloadedImage
{   
    // The image has been downloaded. Put the image into the UIImageView
    [imageView setImage:downloadedImage.Image];
}

回答が得られたらここに投稿してください。これで解決したかどうかを知りたいです。

于 2009-08-08T06:28:53.753 に答える