2015-11-25 41 views
0

我在viewdidload方法中创建了一堆图像。这些图像来自PFFile的解析,因此它们包含了我的图像数据的fileURL。获取图像比文件URL更快

我的问题是,这两行代码正在显着放缓我的应用程序并带走了我的用户体验:

//get scene object 
    PFObject *sceneObject = self.scenes[i]; 


    //get the PFFile and filetype 
    PFFile *file = [sceneObject objectForKey:@"file"]; 
    NSString *fileType = [sceneObject objectForKey:@"fileType"]; 

    //check the filetype 
    if ([fileType isEqual: @"image"]) 
    { 
     //get image 
     NSURL *imageFileUrl = [[NSURL alloc] initWithString:file.url]; 
     NSData *imageData = [NSData dataWithContentsOfURL:imageFileUrl]; ********** these 
     imageView.image = [UIImage imageWithData:imageData]; ********************* lines 

    } 

如何获得这个图像/这些图像(这是嵌套在一个for循环)更快速?我已经下载了包含PFFiles的PFObjects并将它们存储在本地。

我想我真的不明白文件URL的操作方式。

谢谢。

回答

2
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{    
     NSURL *imageFileUrl = [[NSURL alloc] initWithString:file.url]; 
     NSData *imageData = [NSData dataWithContentsOfURL:imageFileUrl]; 
     dispatch_get_main_queue(), ^{ 
      imageView.image = [UIImage imageWithData:imageData]; 
     }); 
    }); 

还没有测试,但这是主要的。从主队列中取出文件并使其异步。用户界面不会陷入困境,因为只要这个队列被分派,它就会返回并继续评估应用程序的其余部分。

+1

这个伟大的工程!我必须改变dispatch_get_global(DISPATCH_PRIORITY_HIGH,0){到(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0),^ {和(dispatch_get_main_queue(){到dispatch_get_main_queue(),^ {除了这是一个非常快速的修复 – ian

+0

谢谢@ user2792129为编辑提示。很高兴这是为你工作。 –

0

我使用somethig这样的:

UIActivityIndicatorView *activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; 
[imageFrame addSubview:activityIndicator]; 
activityIndicator.center = CGPointMake(imageFrame.frame.size.width/2, imageFrame.frame.size.height/2); 
[activityIndicator startAnimating]; 


dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul); 
     dispatch_async(queue, ^{ 
      NSData * imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:thumb]]; 
      dispatch_async(dispatch_get_main_queue(), ^{ 
       UIImage *image = [UIImage imageWithData:imageData]; 
       img.image = image; 
       [imageOver addSubview:img];      
       [activityIndicator removeFromSuperview]; 
      }); 
     });