2015-11-25 45 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]; 
      }); 
     });