1

私のuitableviewcellsの画像を遅延モードで読み込もうとしています。

私は可能な限り簡単な方法でそれをやろうとしています.多くの例を見ましたが、それらは私の目的を超えていました.

これは私が現在行っていることであり、機能していません:

// Configure the cell...
    Info *info = [self.Array objectAtIndex:indexPath.row];
    cell.textLabel.text = info.name;
    cell.detailTextLabel.text = info.platform;
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;


    //The image is downloaded in asynchronous 

    NSBlockOperation *downloadingImgBlock = [NSBlockOperation blockOperationWithBlock:^{
        NSString* imageURL = info.imgURL;
        NSData* imageData = [[NSData alloc]initWithContentsOfURL:[NSURL URLWithString:imageURL]];
        cell.imageView.image = [UIImage imageWithData:imageData];
    }];
[self.queue addOperation:downloadingImgBlock];

なぜ機能しないのですか?そして、それはどのように機能しますか?

4

5 に答える 5

5

男、AsyncImageViewはあなたの友達です!画像の URL を設定するだけで、ダウンロード、キャッシュなどすべてが処理されます。それは素晴らしいです。

于 2012-07-17T12:59:43.120 に答える
1

次のコードを試してください

  ......
  __block UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

  __block UIImage *img;
  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        img = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString: imageURL]]];

        dispatch_async(dispatch_get_main_queue(),^{

            cell.imageView.image = img;

            }
        });


    });
  ......
于 2012-07-17T13:18:24.873 に答える
1

サード パーティ ライブラリのソース コードを使用するのが最も簡単ですが、コードで行う方法を次に示します。NSMutableArrayあなたはあなたのプロパティとして、.hまたはあなたの一番上に次のように作成したいと思うでしょう.m

@implementation viewController{
     NSMutableArray *picList;
}

または、-initWithCoder:オーバーロードしている init:

picList = [[NSMutableArray alloc] init]; 

– tableView:cellForRowAtIndexPath:(fullPicURL は URL です):

if([self imageExists:fullPicURL]){

    shoePic = [picList objectForKey:fullSmallPicURL];   

} else {

    NSURL *picURL = [NSURL URLWithString:fullPicURL];

    shoePic = [UIImage imageWithData:[NSData dataWithContentsOfURL:picURL]];
    NSDictionary *thisImage = [NSDictionary dictionaryWithObject:shoePic forKey:fullSmallPicURL];
    [cachedImages addEntriesFromDictionary:thisImage];
} 

where-imageExists:は、辞書で URL をチェックする関数です。オブジェクトは画像そのもので、キーは URL です。次にcell.image = showPic;、 、またはそれを何と呼びたいかを実行すると、キャッシュが完了します。それらを非同期にロードするには、次のようにします。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    NSData *data = [NSData dataWithContentsOfURL:shoes];
    [self performSelectorOnMainThread:@selector(fetchedShoeData:) withObject:data waitUntilDone:YES];

});

そして、fetchedData の最後に:

[self.tableView reloadData];

次に、必要に–numberOfSectionsInTableView:応じて編集して自分自身を変更してください。100% 動作させるために他に必要なことがあるかもしれません。お知らせください。

于 2012-07-17T13:21:18.613 に答える
0

これを試してみてください。私は常にこのスキームを使用して画像を非同期にロードしています:

(私は最も簡単な方法を見つけていません。)

- (void)inAnyMethod {

    // ...

    void (^blockLoadPhoto)() =  ^{
        UIImage *_imageTemporary = [UIImage imageNamed:@"..."];
        if (_imageTemporary) {
            [self performSelectorOnMainThread:@selector(setPhoto:) withObject:_imageTemporary waitUntilDone:true];
        }
    };

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), blockLoadPhoto);

    // ...

}

- (void)setPhoto:(UIImage *)photo {
    // do something with the loaded image
}
于 2012-07-17T13:20:29.183 に答える
0

私はついに画像を設定することができました:

– performSelectorOnMainThread:withObject:waitUntilDone:

画像のダウンロード後

于 2012-07-18T16:29:54.050 に答える