应用程序因图像加载问题而放慢速度

时间:2013-03-14 10:59:02

标签: ios objective-c uikit grand-central-dispatch

我在应用程序中加载内容时遇到问题,我看到数据是由应用程序提取的,但图像需要花费大量时间才能加载,是否有可能加载后面的图像。代码如下:

NSDictionary *dict=[discussionArray objectAtIndex:indexPath.row];
UIImageView *avatarimage = (UIImageView *)[cell viewWithTag:4];
NSString *photoStrn=[dict objectForKey:@"photo"];

 dispatch_async(dispatch_get_global_queue(0,0), ^{
                   NSString *u=[NSString stringWithFormat:@"http://%@",photoStrn];
                   NSURL *imageURL=[NSURL URLWithString:u];
                   NSData *imageData = [NSData dataWithContentsOfURL:imageURL];
                   dispatch_sync(dispatch_get_main_queue(), ^{
                   UIImage *dpImage = [UIImage imageWithData:imageData];
                   if (dpImage==nil)
                   {
                     dpImage = [UIImage imageNamed:@"profileImage.png"];
                   }
                   avatarimage.image = dpImage;

        });

如果您需要更多详细信息,我将提供:)

3 个答案:

答案 0 :(得分:4)

您可以使用GCD执行此操作:

dispatch_async(dispatch_get_global_queue(0,0), ^{
     for (NSDictionary *dic in discussionArray)
     {
        NSString *photoStr=[dic objectForKey:@"photo"];
        NSString * photoString=[NSString stringWithFormat:@"http://%@",photoStr];
        UIImage *dpImage =  [UIImage imageWithData: [NSData dataWithContentsOfURL:[NSURL URLWithString:photoString]]];
        if (dpImage==nil)
        {
            dpImage = [UIImage imageNamed:@"profileImage.png"];
        }
     }
});

答案 1 :(得分:0)

获取SDWebImage Here并将其添加到您的项目中并添加

  

的UIImageView + WebCache.h

在类实现文件

UIImageView *imag=[[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 40, 40)];
[imag setImageWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@",[[jsonarray objectAtIndex:indexPath.row]valueForKey:@"imgurl"]]] placeholderImage:[UIImage imageNamed:@"Icon@2x.png"]];
[self.view addSubview:imag];
[imag release];

SDWebImage对于从URL加载图像更有用。

希望这有助于!!!

答案 2 :(得分:0)

詹姆斯

有了这一行,

[NSData dataWithContentsOfURL:[NSURL URLWithString:photoString]]]

您在主线程上进行同步网络调用。网络呼叫完成后,当前线程将挂起。

解决方案是进行异步网络调用。 AFNetworking库提供了一个很好的类别来异步加载图像:UIImageView+AFNetworking