2015-05-01 189 views
0

我正在开发一个iOS应用程序。并通过JSON获取图像并在桌面上显示。使用此方法dispatch_async(kBgQueue, ^{...和图像显示在桌面视图上,但所有图像都显示在一个单元格上并自动回收。图像可能会在一段时间后改变,也可以使用占位符图像。使用两个字符串显示图像一个字符串可用于图像名称和第二个字符串可用于URL。然后连接字符串以显示在收集视图中相同问题的图像。任何其他方法在tableview和collection视图中快速显示图像。
我的代码:加载JSON图像快速

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

    { 
     mycell=[tableView dequeueReusableCellWithIdentifier:@"cell"]; 
     UILabel *mylabel = (UILabel *)[mycell viewWithTag:100]; 
     NSDictionary *dic=[str objectAtIndex:indexPath.row]; 
     GRLanguage *sharedManager = [GRLanguage sharedManager]; 
     if ([sharedManager.LanguageCode isEqual:@"hi"]) { 
      mylabel.text=[dic objectForKey:@"hindi_name"]; 
     }else if ([sharedManager.LanguageCode isEqual:@"pa"]) 
     { 
      mylabel.text=[dic objectForKey:@"punjabi_name"]; 
     }else 
     { 
      mylabel.text=[dic objectForKey:@"name"]; 
     } 


     [mycell setBackgroundColor:[UIColor clearColor]]; 
     UIImageView *img = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"back copy.png"]]; 
     self.tableview.backgroundView =img; 


     dispatch_async(kBgQueue, ^{  //Using For Lazy Loading 
      UIImageView *imagetlt = (UIImageView *)[mycell viewWithTag:1]; 
      NSString *image =[dic objectForKey:@"image_path"]; 
      NSString *[email protected]"http://webapp.opaxweb.net/images/"; 
      path=[path stringByAppendingString:image]; 
      NSData *imageData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:path]]; 
      if (image == nil) { 
       [imagetlt setImage:[UIImage imageNamed:@"rel_circle.png"]]; 
      }else 
      { 
       dispatch_async(dispatch_get_main_queue(), ^{ 
        // UITableViewCell*img = (id) [tableView cellForRowAtIndexPath:indexPath]; 
        imagetlt.image = [UIImage imageWithData: imageData]; 
       }); 

      } 


    }); 
    return mycell; 
} 
+0

建议 - 在GitHub中的AsyncImageLoader。 –

+0

使用AFNetworking .. –

回答

0

你有一个严重的问题。您创建一个单元格,然后尝试异步加载图像并尝试将其存储在单元格中。这是行不通的。细胞将被重复使用。到图像到达时,单元格可能会显示完全不同的数据。

以下是您的操作:您将从URL返回的图像保存在内存中或存储在文件中。在cellForRowAtIndexPath中,您尝试检索缓存的图像并存储该图像,或者存储占位符图像并开始异步下载。下载完成后,将图像放入缓存并调用reloadRowsAtIndexPaths:以便重新加载该行。

如果在异步下载运行时项目可以更改其行(因为用户添加或删除行或更改排序顺序等),甚至更好,当异步下载结束时,您会确定哪一行包含该项目(下载开始时可能不包含该项目),并为该行调用reloadRowsAtIndexPaths:。