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

使用 3rd 方库源代码将是最简单的,但这是您将如何在代码中执行此操作。您将要在您的或您的顶部创建NSMutableArray一个属性,如下所示:.h.m

@implementation viewController{
     NSMutableArray *picList;
}

并且在-initWithCoder:或者,无论你重载什么初始化:

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];
} 

您编写的函数在哪里-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 回答