1

私は2つのView Controllerで同じコードを使用しています(それらは同じクラスを実装しており、ダウンロードするURLが変更されます)、ある場合には画像が正しく表示され、別の場合には空のセルが表示されます。

これが私のコードです:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *simpleTableIdentifier=@"MyCell";
    //this is the identifier of the custom cell
    MyCell *cell = (MyCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

    tableView.backgroundColor=[UIColor clearColor];
    tableView.opaque=NO;
    tableView.backgroundView=nil;

    if (cell == nil)
    {
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"MyCell" owner:self options:nil];
        cell = [nib objectAtIndex:0];
    }
    NSLog(@"Image url is:%@",[images_url objectAtIndex:indexPath.row]);
    NSURL *url_image=[NSURL URLWithString:[images_url objectAtIndex:indexPath.row]];

    cell.myimage.image=[UIImage imageWithData:[NSData dataWithContentsOfURL:url_image]];


    return cell;
}

私が言ったように、同じクラスを実装する2つのView Controllerがあります。ビューでは、ロードされた URL はフラグの値に応じて設定されます。コントローラ A を開くと画像が表示されませんが、ビュー B を開くと画像が表示されます。挿入した NSLog で確認できるので、どちらの URL も正しいです。

何が問題なのですか?

4

1 に答える 1

1

残念ながら、「NSData dataWithContentsOfURL」の呼び出しはブロッキング呼び出しです。プログラムの実行は、iOS がサーバーからすべてのデータを取得できるようになるか、試行に失敗するまで停止します。LTE または WiFi を使用している場合、これは多くの場合「高速」です。しかし、長い時間がかかる可能性があります。

その間、アプリの「メイン スレッド」を使用しているため、アプリがフリーズしたように見え、システムのウォッチドッグ タイマーによってアプリが強制終了される可能性があります。あなた以外の誰かがこのアプリを使用する場合は、テーブルビュー セルの画像に、すぐに取得されるローカル データを入力するか、非同期メソッドを使用する必要があります。

「遅延読み込みUIImage」をグーグルで検索してください。この SO の質問には、件名に関するいくつかの良いヒントがあります: lazy-load-images-in-uitableview

さらに、これらの行をいくつかのセットアップ コードに移動する必要があります。セルを更新するたびに実行する必要はありません。

tableView.backgroundColor=[UIColor clearColor];
tableView.opaque=NO;
tableView.backgroundView=nil;

頑張ってください!

于 2013-01-28T00:37:38.573 に答える