【问题标题】:How to asynchronously download images in ios?如何在ios中异步下载图像?
【发布时间】:2014-04-17 09:07:32
【问题描述】:

我想首先在滚动视图上创建图像视图。我设置占位符图像或给图像视图的背景颜色。所以所有图像视图都显示。

- (void)LoadDataInScrollView
{
    dispatch_queue_t imageQueue = dispatch_queue_create("Image Queue",NULL);

    //totalImageGetDict into count total Number of object and generate imageview.

    for (int ivalue = 0; ivalue < [totalImageGetDict count]; ivalue++) 
    {
        dispatch_async(imageQueue, ^{

            //define x value
            CGFloat xOrigin =ivalue *ascrollView.frame.size.width+50;

            imageView = [[UIImageView alloc] init];
            imageView.tag = ivalue;
            [imageView setBackgroundColor:[UIColor whiteColor]];
            imageView.frame = CGRectMake(xOrigin-40,imgYpos, ascrollView.frame.size.width-20, scrollViewHight);

            //then here first i set already downloaded image.it's comes from another class. getImageLoadDict into images are already downloaded**

            if ([getImageLoadDict objectForKey:[NSNumber numberWithInteger:ivalue]]!= nil)   
            {
                //dispatch_async(dispatch_get_main_queue(), ^{
                [imageView setImage:[getImageLoadDict objectForKey:[NSNumber numberWithInteger:ivalue]]];
                //});

            } 
            else 
            {
                //totalImageGetDict into remaining images object and asynchronously download here.

                STVisionPhoto *photoObj = [totalImageGetDict objectForKey:[NSNumber numberWithInteger:ivalue]];
                UIImage *newimage = [photoObj image];

                dispatch_async(dispatch_get_main_queue(), ^{
                    [imageView setImage:newimage];
                });
           }

           [ascrollView addSubview:imageView];
        });
    }
}

【问题讨论】:

  • 您在代码中使用的是 ASIHTTP 还是 AFNetworking?只是想看看你是不是 - 然后尝试使用那里的类别在后台线程上异步下载图像。
  • @RenoJones,我没有使用那个类。我使用 Nsurl 类调用。
  • 啊,好吧。然后选择 SDWebImage(他们正在以更好的方式处理异步下载),您不必为图像下载而烦恼。

标签: ios objective-c asynchronous objective-c-blocks


【解决方案1】:

你可以使用SDWebImage来做,非常好用

编辑:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    UIImage * image = [UIImage imageWithData:[NSData dataWithContentsOfURL:your url]];

    dispatch_async(dispatch_get_main_queue(), ^{
        [imgview setImage:image];
    });
});

如果你不想使用任何库,你可以试试这个

【讨论】:

  • 我不想使用任何库。
  • +1 是为了不(直接)使用 NSURLConnection 的简单性。
  • +1 你的回答是对的。我检查并接受它,但它不满足我的条件。谢谢
【解决方案2】:

尝试使用此代码:

UIImageView *imgView = [[UIImageView alloc] init];
imgView.frame = CGRectMake(12.5, 12.5, 80, 80);
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
 UIImage *profileImage;
 profileImage = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:YOUR_URL_STRING]]];
dispatch_async(dispatch_get_main_queue(), ^{
                            imgView.image = profileImage;

                                          });


                             });

[cell.contentView addSubview:imgView];

【讨论】:

  • ,我试试这个,也遵循懒加载器类。
  • +1 你的回答是对的。我检查并接受它,但它不满足我的条件。
【解决方案3】:
(void)loadImg:(NSString *)url img :(UIImageView *)imgView{
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]];
__weak UIImageView *imageV = imgView;
[imgView setImageWithURLRequest:request placeholderImage:[UIImage imageNamed:@"songRecDef"] success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {
    imageV.image = image;
    [imageV setNeedsLayout];
    NSLog(@"%@",response);
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) {
    [imageV setImage:[UIImage imageNamed:@"songRecDef"]];
    NSLog(@"%@",error);
}];
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多