0

私のアプリケーションでは、JSON データを解析し、そのデータを UITableView に表示しています。情報は表に表示されますが、タッチの反応が非常に遅いです。いくつかの調査を行ったところ、情報、特に画像の非同期読み込みを実装することが推奨されていることがわかりましたが、JSON アプリケーションで機能する関連ソリューションが見つかりませんでした。この問題を解決する方法についての提案とコメントをいただければ幸いです。コードは次のとおりです。

jURL 定義 www.website.com/info.json

- (void)viewDidLoad
{
    [super viewDidLoad];
    dispatch_async(jQueue, ^{

        NSData* data = [NSData dataWithContentsOfURL:

                        jURL];

        [self performSelectorOnMainThread:@selector(fetchedData:)

                               withObject:data waitUntilDone:NO];

    });

}



- (void)fetchedData:(NSData *)responseData {
    NSError* error;

    NSDictionary* jsonDict = [NSJSONSerialization

                          JSONObjectWithData:responseData

                          options:kNilOptions

                          error:&error];

    calRes = [jsonDict objectForKey:@"results"];

    [self.tableView reloadData];

}



 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    NSDictionary *calDict = [calRes objectAtIndex:indexPath.row];

    NSURL *imageURL = [NSURL URLWithString:[calDict objectForKey:@"image"]];

    NSData *imageData = [NSData dataWithContentsOfURL:imageURL];

    UIImage *imageLoad = [[UIImage alloc] initWithData:imageData];

    cell.textLabel.text = [calDict objectForKey:@"name"];

    cell.detailTextLabel.text = [calDict objectForKey:@"description"];    
    cell.imageView.image = imageLoad;

    return cell;
}
4

4 に答える 4

2

このリンクから SDWebImage を使用できます: https://github.com/rs/SDWebImage これは、非同期のイメージ読み込み用の最もシンプルで最速のライブラリです。また、画像キャッシュも提供します。この関数を呼び出すだけで、すべての操作を実行できます。

[cell.imageView setImageWithURL:jURL
                   placeholderImage:[UIImage imageNamed:@"your place holder here"]];

楽しんで。

于 2013-02-23T04:14:51.817 に答える
2

画像の非同期読み込みを簡単に行うには、 AFNetworking ライブラリを使用するのが好きです。ライブラリを含める必要があります

#import "AFNetworking.h"

次に、それを cellForRowAtIndexPath で使用します

[cell.imageView setImageWithURL:[NSURL URLWithString:[calDict objectForKey:@"image"]]
    placeholderImage:[UIImage imageNamed:@"placeholder"]];

また、プレースホルダー イメージを提供する必要があります。最終的な画像にしたいサイズの空白の JPG を使用します。

于 2013-02-22T22:37:30.530 に答える
1

フォローアップとして、Jake Marsh によるこの非常に便利なプラグインを使用して、画像をローカルにキャッシュすることをお勧めします: JMImageCache

これにより、次回アプリを起動するときに画像を URL から読み込む必要がなくなります。

于 2013-02-22T22:57:27.947 に答える
1

ほら、cellforRowAtIndexPathの遅れはこれが原因です

NSURL *imageURL = [NSURL URLWithString:[calDict objectForKey:@"image"]];

NSData *imageData = [NSData dataWithContentsOfURL:imageURL];

UIImage *imageLoad = [[UIImage alloc] initWithData:imageData];

画像の追加にGCDを使用してみませんか?さらに、独自の NSCache を使用して画像を保存することもできます。これにより、テーブルがリロードされるたびに、URL を起動する代わりに画像をメモリから直接読み込むことができます。

于 2014-05-30T04:50:30.887 に答える