2

それぞれ50Kb〜2 Mbの画像を20〜25ダウンロードして、テーブルビューに表示する必要があります。これにASIHTTPRequestasynリクエストを使用しました。しばらくすると、アプリが動かなくなってしまうのを観察しました。非同期呼び出しを使用しているため、これは発生しないはずです。ASIHTTPRequestに問題があると思い、didFinishedセレクターがメインスレッドで呼び出されることを確認しました。私がしているのは

-(void)didFinishedDownloadingImage:(ASIHTTPRequest *)request
{{
    NSData * responseData = [request responseData];
    UIImage * image = [UIImage imageWithData:responseData];
    [[data objectAtIndex:request.tag] setImage:image];
    [self.tableView reloadData];
}

これで問題はないと思います。また、cellforrowatindexpathで私はただします

-(UItableViewCell *)tableviewView:(UItableView *)tableview
                  cellForItemAtIndexPath:(NSIndexPath *)indexPath {

    UserProfile * user = [data objecAtIndex:indexpath.row];

    UITableViewCell * cell = [tableView
                              dequeueReusableCellWithReuseIdentifier:@ "ProfileCell"
                              forIndexPath:indexPath];
    if(cell == nil){
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewDefaultStyle];
    }

    NSString * fullname = [NSString stringWithFormat:@ "%@ \ n%@"、
                                    user.firstname、user.lastname];
    if(user.image!= nil)
        [cell.imageView setImage:user.image];
    そうしないと{
        [cell.imageView setImage:[UIImage imageNamed:@ "placeholder.jpg"]];
    }    
    [cell.label setText:fullname];
    セルを返します。
}

ただし、アプリは低速で1〜2秒間フリーズしますが、これはかなりの時間です。これを非常にスムーズに行うアプリを見てきました。上記のコードを使用するとパフォーマンスが大幅に向上する固定サイズの5Kbの画像を使用してみました。すべてのダウンロードはASIHTTPを介して他のスレッドで行われるため、この場合、なぜそれが大きな画像に違いをもたらすのかわかりません。

4

2 に答える 2

2

フレームワークをAFNetworkingに置き換えてください。

簡単に使えます。

IImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 100.0f, 100.0f)];
[imageView setImageWithURL:[NSURL URLWithString:@"http://i.imgur.com/r4uwx.jpg"] placeholderImage:[UIImage imageNamed:@"placeholder-avatar"]];

または...TableViewCellで直接

NSURL *url = [[NSURL alloc] initWithString:[movie objectForKey:@"artworkUrl100"]];
[cell.imageView setImageWithURL:url placeholderImage:[UIImage imageNamed:@"placeholder"]];

「2行目では、NSURLを渡すことでサムネイルが配置されている画像ビューに通知し、リクエストが応答を返さない限り表示されるプレースホルダー画像を渡します。」

それで全部です!

ここに、そのhttp://mobile.tutsplus.com/tutorials/iphone/ios-sdk_afnetworking/に関するチュートリアルがあります。

于 2013-01-17T10:56:57.840 に答える
1

アプリケーションの遅延/低速の根本原因について推測するのは簡単です。推測する代わりに、疑惑を試してみませんか?TimeProfiler機器を使用してアプリケーションをプロファイリングします。アプリケーションが最も時間を費やしているメソッドと機能がわかります。

プロファイルを作成する機会が得られるまでのアイデアは次のとおりです。

フル解像度の画像をダウンロードし、バックグラウンドでサムネイルを作成してから、それらをNSCacheオブジェクトにキャッシュすることを検討してください。[UIImage imageWithData:responseData];バックグラウンドスレッドで実行することもできます。ビュー階層と相互作用する時点まで、スレッドセーフです。

単一のセルを選択的にリロードする方が、テーブルビュー全体、特に画像が多いテーブルビュー全体をリロードするよりも高速である必要があります。さらに、すべてのネットワーキングと処理をバックグラウンドキューで実行している場合、テーブルビューのスクロールが遅くなる理由はありません。メソッドの実装全体を見せていただけます-cellForRowAtIndexPath:か?setImage:レンダリングが遅いので、あなたはあなたがあなたの遅い点だと思うと言いました。単一のセルをリロードする場合、レンダリングする必要があるのは1つのセルだけです。テーブルビュー全体をリロードする場合は、すべてのセルを再レンダリングする必要があります。

于 2013-01-17T19:42:45.207 に答える