在tableview单元格中加载异步图像

时间:2012-10-18 05:10:25

标签: iphone

我是iPhone编程的新手。我想将图像加载到UITableView。我的图片来自网络。我知道我必须使用ASIHttp Request,然后将图像加载到UITableview。但是,如果我这样做,那么直到它的加载图像UITableview挂起。 如果我使用异步图像加载块,那么每次Cell==nil或重用请求佣人时,我都不想这样做。

我在Tableview cellForRowAtIndexpath中使用的代码行。

    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {

        static NSString *CellIdentifier = @"CellIdentifier";

        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        UIImageView *imgViewCellBg;

        if (cell == nil) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
            cell.accessoryType=UITableViewCellAccessoryNone;



                   imgViewCellBg = [[UIImageView alloc] initWithFrame:CGRectMake(0,0,320,151)];
                   imgViewCellBg.userInteractionEnabled = NO;
                     imgViewCellBg.backgroundColor = [UIColor whiteColor];
                   imgViewCellBg.tag = 10000;
                   [cell.contentView addSubview:imgViewCellBg];
                   [imgViewCellBg release];

         }
       else{
                   imgViewCellBg = (UIImageView *)[cell.contentView viewWithTag:10000];
            }


     //-------------------------------- For the image Downloding And Displaying ------
            __block ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:(MY Url)]];
            [request setCompletionBlock:^{
                // NSLog(@"Image downloaded.");
                NSData *data = [request responseData];
                UIImage *imageCountry = [[UIImage alloc] initWithData:data];

                [imgViewCellBg setImage:imageCountry];
                imageCountry = Nil;

            }];
            [request setFailedBlock:^{
                NSError *error = [request error];
                NSLog(@"Error downloading image: %@", error.localizedDescription);
            }];
            [request startAsynchronous];
            //-----------------------------------------------------------------


 return cell;

3 个答案:

答案 0 :(得分:1)

只需添加https://github.com/SIMHAM/AsyncImageView-1

中的AsyncImageView文件即可

然后你可以在你的单元格中添加imageView,如下所示:

AsyncImageView *asyncImageView=[[AsyncImageView alloc] initWithFrame:CGRectMake(15,20,80.0f,110.0f)];
[asyncImageView loadImageFromURL:[NSURL URLWithString:yourImageUrl]];
[cell.contentView addSubview:asyncImageView];

答案 1 :(得分:1)

根据我的建议,我使用SDWebImages A Link of GitHubproject

进行异步操作

我将此配置如下: -

  • 您需要先右键单击您的项目名称: - >将文件添加到您的项目 - >选择了SDWebImageproject并添加它们

注意: - 请不要选中复制选项

  • 现在点击你的xcode中的项目名称来构建阶段: - > target dependencies: - >点击+按钮添加SDWebimage ARC

  • 现在选择链接二进制文件库点击+按钮添加libSDWebimageARC.a并再次单击+并添加imageIO.framework并添加libxml2.dylib就可以了

    转到构建设置: - >其他链接标记: - >添加-ObjC

    和标题搜索路径添加这三项

    1 / usr / include / libxml2

    2“$(OBJROOT)/ UninstalledProducts / include”

    3“$(TARGET_BUILD_DIR)/ usr / local / lib / include”

now build and run its working like smoothly cheers.... :)

这对于加载图像及其商店捕获来说更加简单和非常有用,因此您可以更快地完成工作。

你可以只用两行代码来实现异步图像,比如

.m: -

#import <SDWebImage/UIImageView+WebCache.h>

 NSString *strUrlSting =[d valueForKey:@"Current_RequestUser_Image"];
        strUrlSting =[strUrlSting stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];
        NSURL* url = [NSURL URLWithString:strUrlSting];

        [imgView_user1 setImageWithURL:url
                      placeholderImage:[UIImage imageNamed:@"placeholder.png"]];

答案 2 :(得分:1)

这是AysncImageView的示例,您可以从AynchImageView with Example

下载此课程

您可以像下面的代码一样访问此类。

- (UITableViewCell *)tableView:(UITableView *)tableView

           cellForRowAtIndexPath:(NSIndexPath *)indexPath {

        static NSString *CellIdentifier = @"ImageCell";
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

        if (cell == nil) {
            cell = [[[UITableViewCell alloc]
                  initWithFrame:CGRectZero reuseIdentifier:CellIdentifier]
                  autorelease];
        } else {
        AsyncImageView* oldImage = (AsyncImageView*)
                 [cell.contentView viewWithTag:999];
        [oldImage removeFromSuperview];
        }

        CGRect frame;
        frame.size.width=75; frame.size.height=75;
        frame.origin.x=0; frame.origin.y=0;
        AsyncImageView* asyncImage = [[[AsyncImageView alloc]
                   initWithFrame:frame] autorelease];
        asyncImage.tag = 999;
        NSURL* url = [imageDownload
                   thumbnailURLAtIndex:indexPath.row];
        [asyncImage loadImageFromURL:url];

        [cell.contentView addSubview:asyncImage];

        return cell;
    }

我希望这对你有所帮助。