2013-06-20 76 views
0

我已經建立了一個iOS應用程序使用Parse.com如何改進圖像加載問題。有沒有像解決方案緩存

在我的應用程序中,我顯示了很多來自網絡的數據。

要快速加載數據我使用了緩存kPFCachePolicyCacheThenNetwork。它加載數據正常,但滾動時圖像需要一定的時間加載。

第一個白色圖像,然後圖像加載。

Is there any solution like cache to display images in imageviews with out interruption.

感謝。

+0

可以使用SDWebimage庫 –

+0

使用afnetworking +類的UIImageView其良好的 – amar

回答

1

我在gcd的幫助下編寫代碼,你只需傳遞imageView的對象並傳遞url,它管理所有的東西,比如緩存。

-(void)downloadingServerImageFromUrl:(UIImageView*)imgView AndUrl:(NSString*)strUrl{ 


strUrl = [strUrl encodeUrl]; 

NSString* theFileName = [NSString stringWithFormat:@"%@.png",[[strUrl lastPathComponent] stringByDeletingPathExtension]]; 


NSFileManager *fileManager =[NSFileManager defaultManager]; 

NSString *fileName = [NSHomeDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"tmp/%@",theFileName]]; 



imgView.backgroundColor = [UIColor darkGrayColor]; 
UIActivityIndicatorView *actView = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite]; 
[imgView addSubview:actView]; 
[actView startAnimating]; 

CGSize boundsSize = imgView.bounds.size; 
CGRect frameToCenter = actView.frame; 
// center horizontally 
if (frameToCenter.size.width < boundsSize.width) 
frameToCenter.origin.x = (boundsSize.width - frameToCenter.size.width)/2; 
else 
frameToCenter.origin.x = 0; 




// center vertically 
if (frameToCenter.size.height < boundsSize.height) 
frameToCenter.origin.y = (boundsSize.height - frameToCenter.size.height)/2; 
else 
frameToCenter.origin.y = 0; 

actView.frame = frameToCenter; 



dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
dispatch_async(queue, ^{ 

NSData *dataFromFile = nil; 
NSData *dataFromUrl = nil; 

dataFromFile = [fileManager contentsAtPath:fileName]; 
if(dataFromFile==nil){ 
    dataFromUrl=[[[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:strUrl]] autorelease];      
} 

dispatch_sync(dispatch_get_main_queue(), ^{ 

    if(dataFromFile!=nil){ 
     imgView.image = [UIImage imageWithData:dataFromFile]; 
    }else if(dataFromUrl!=nil){ 
     imgView.image = [UIImage imageWithData:dataFromUrl]; 
     NSString *fileName = [NSHomeDirectory() stringByAppendingPathComponent:[NSString stringWithFormat:@"tmp/%@",theFileName]]; 

     BOOL filecreationSuccess = [fileManager createFileAtPath:fileName contents:dataFromUrl attributes:nil];  
     if(filecreationSuccess == NO){ 
      NSLog(@"Failed to create the html file"); 
     } 

    }else{ 
     imgView.image = [UIImage imageNamed:@"NO_Image.png"]; 
    } 
    [actView removeFromSuperview]; 
    [actView release]; 
    [imgView setBackgroundColor:[UIColor clearColor]]; 
}); 
}); 

}

+0

strUrl = [strUrl encodeUrl]; .. NSString沒有可見的@interface聲明選擇器'encodeURL' – user2492409

+0

對不起,我使用類別來轉換字符串進行編碼,所以它可以從url字符串中刪除空格。 – SachinVsSachin

0

這裏是在後臺加載圖像的代碼。檢查此Code

+0

請嘗試給一些細節becoz如果鏈接過期您的ANS變得無用 – amar

3

您可以使用SDWebImage這樣做。

您也可以使用NSCache進行緩存。

+2

+1'SDWebImage',這實際上既提供'NSCache'基於緩存以及持久存儲緩存。如果某人已經在使用AFNetworking,那麼它的'UIImageView'類別並不差,但我認爲'SDWebImage'提供了一些額外的功能,如果你需要的只是圖像緩存。 – Rob

2

是的,你可以使用AFNetworking的UIImageView類和你的排序

,你也可以禁用,如果您編輯現有的圖像,然後dwnload從相同的URL,通過manipulagting其

通常需要特定圖像的緩存
-(void)setImageWithURL:(NSURL *)url 
     placeholderImage:(UIImage *)placeholderImage 

在本blog

提到的另一種選擇可能是ASImageView與設施,以刷新緩存。

0

你應該使用EGOImageLoading(EGOImageLoading)的圖像延遲加載,並且可以使用NSUserDefaults的保存圖像。

這是我建議的最佳方式,因爲我在很多項目中都使用過它。

0

不好意思說出來,但Parse已經在做所有這些事情了。解析使用AFNetworking獲取圖像,將它們放在NSCache中,並且非常積極地使用磁盤緩存,以便完全避免冗餘的網絡旅程(該版本是URL的一部分,所以Parse甚至不需要使用if-modified - 因爲GET)。

您可能遇到的最大問題是PFFile限制下載,一次只下載3張圖片。實驗後,這是最好的數字,因爲它確保了對用戶的增量反饋,並避免了一些令人討厭的問題,其中一些iOS設備在線程過多後性能會很差。我可以提供給你的最好建議是在可能的情況下預取一些圖像。如前所述,PFFile圖像非常積極地緩存。 kPFCachePolicy ...東西只會影響可能會過時的查詢;這些查詢指向的圖像總是被緩存(儘管只是最初按需下載)。

相關問題