【问题标题】:Asynchronous loading of images?异步加载图像?
【发布时间】:2013-04-18 05:29:32
【问题描述】:

如何异步加载图像?这就是我目前正在做的事情(借用开源代码来加载图像缩略图):

- (UIImage*)thumbnailListView:(ThumbnailListView*)thumbnailListView
                 imageAtIndex:(NSInteger)index
{
    NSURL* url = [NSURL URLWithString:[recommendedArray objectAtIndex:index]] ;

//  [[cell grid_image] setImage:[UIImage imageWithData:[NSData dataWithContentsOfURL:url]]];



NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
BOOL isImageLoaded = YES;
UIImage *bookImage = [UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/%@", docPath, [[recommendedArray objectAtIndex:index] lastPathComponent]]];

if(bookImage == nil)
    isImageLoaded = NO;

if(!isImageLoaded){
    UIImage *thumbnailImage =[UIImage imageNamed:@"App-icon-144x144.png"];}
else{
    UIImage *thumbnailImage = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@",[recommendedArray objectAtIndex:index]]]]];
      return thumbnailImage;

}



}

我尝试将以下内容添加到该方法中,但它会为 NSURL 产生错误:

dispatch_queue_t imageLoadQueue = dispatch_queue_create("com.g.load", NULL);

dispatch_async(imageLoadQueue, ^{
    //Wait for 5 seconds...
    usleep(1000000);

    NSArray *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];    

    for(int k=0; k < [images count];k++){
        NSLog(@"Loading %d Image", k);
        NSString *imgURL = [images objectAtIndex:k];
        NSData *imgData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:imgURL]];
        [imgData writeToFile:[NSString stringWithFormat:@"%@/%@", docPath, [imgURL lastPathComponent]] atomically:YES];
    }

    [[self collectionView] reloadData];
    NSLog(@"DONE WITH ALL IMAGES");
});

错误

[NSURL length]: unrecognized selector sent to instance 0x12ea7240
2013-04-18 11:18:35.456 AssamKart[3084:14d03] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSURL length]: unrecognized selector sent to instance 0x12ea7240'

【问题讨论】:

  • 使用 AsyncImageview 类文件,您也可以参考stackoverflow.com/a/15377082/1713478 回答下载类文件并了解如何实现。
  • 它产生了什么错误?
  • @ReidBelton 检查更新的问题
  • 我没有看到任何对NSURL -length 的呼叫。你确定错误是因为上面的代码吗?
  • @nil 我的错误现在检查代码

标签: ios objective-c uiimageview uiimage lazy-loading


【解决方案1】:

方法内部->

- (UIImage*)thumbnailListView:(ThumbnailListView*)thumbnailListView
                     imageAtIndex:(NSInteger)index  

使用这个->

NSURLConnection *aNSURLConnection= [[NSURLConnection alloc]initWithRequest:<#(NSURLRequest *)#> delegate:<#(id)#> startImmediately:<#(BOOL)#>];

和内部委托

- (void)connectionDidFinishLoading:(NSURLConnection *)connection; 获取图像数据并实现您的逻辑,在这里您将再次调用

- (UIImage*)thumbnailListView:(ThumbnailListView*)thumbnailListView
                     imageAtIndex:(NSInteger)index

递归方法直到你的recommendedArray 用完为止。

【讨论】:

    【解决方案2】:

    就这样吧,

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    
        for (int k=0; k<[images count]; k++) {
        NSString *imgURL = [images objectAtIndex:k];
        NSData* data = [NSData dataWithContentsOfURL: [NSURL URLWithString:imgURL]];
        [data writeToFile:[NSString stringWithFormat:@"%@/%@", docPath, [imgURL lastPathComponent]] atomically:YES];
    
        }
    });
    

    【讨论】:

    • 而不是你的 viewdidload 中的 dispatch_async 块
    • 让我知道imgURL的价值
    • 同样的异常......并且执行没有进入该调度它只是像条件假一样退出
    • 一旦注释掉 viewDidLoad: 方法中的所有代码,并且只使用 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ NSData* data = [NSData dataWithContentsOfURL: [NSURL URLWithString:@"api.kivaws.org/v1/loans/search.json?status=fundraising"]]; });
    • 并检查数据是否来了?
    【解决方案3】:

    您可以使用SDWebImage从网上下载您的图片并使用方法:

    [imageView setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"]
                   placeholderImage:[UIImage imageNamed:@"placeholder.png"]];
    

    【讨论】:

      【解决方案4】:

      使用 AsyncImageView。

      https://github.com/nicklockwood/AsyncImageView

      AsyncImageView *imageView = [[AsyncImageView alloc] initWithFrame:CGRectMake(Your Frame)];
      imageView.contentMode = UIViewContentModeScaleAspectFill;
      imageView.clipsToBounds = YES;
      NSURL *URL =  [NSURL URLWithString:[NSString stringWithFormat:URL]];
      [AsyncImageLoader defaultCache];
      [[AsyncImageLoader sharedLoader]loadImageWithURL:URL target:self success:@selector(successSelector) failure:@selector(failureSelector)];
      

      【讨论】:

      • 您不需要手动在块上调用它...它将为您异步运行。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-10
      • 2011-12-23
      • 2013-04-08
      • 1970-01-01
      相关资源
      最近更新 更多