ios開發緩存
簡單列舉一下,iOS的本地緩存方案有挺多,各有各的適用場景:
本文主要聊聊YYCache的優秀設計。高性能的線程安全方案是YYCache比較核心的一個設計目標,很多代碼邏輯都是圍繞性能這個點來做的。與TMMemoryCache方案相比,YYCache在同步介面的設計上採用了自旋鎖來保證線程安全,但仍然在當前線程去執行讀操作,這樣就可以節省線程切換帶來的開銷。而TMCache在同步介面裡面通過信號量來阻塞當前線程,然後切換到其他線程去執行讀取操作,主要的性能損耗在這個線程切換操作上,同步介面沒必要去切換線程執行。此外,使用dispatch_sync實現同步的方案也可以做到節省線程切換的開銷,與加鎖串列的方案相比,性能如何還需要進一步測試驗證。除了高性能的本地存儲方案,YYCache在本地持久化提高性能方面採取了策略,對於大於20k的數據採取直接存儲文件,然後在sqlite中存元信息;對於小於20k的數據則直接存儲在sqlite中。數據完整性保障方面,YYCache在存儲文件時,存在資料庫的元信息和實際文件的存儲必須保障原子性。此外,YYCache還新增了實用功能,比如LRU演算法,基於存儲時長、數量、大小的緩存控制策略等。這些設計和功能使得YYCache在iOS本地緩存方案中具有較高的競爭力和實用性。
『貳』 ios開發中怎麼釋放imagenamed這個方法帶來的內存緩存
這個類庫提供一個UIImageView類別以支持載入來自網路的遠程圖片。具有緩存管理、非同步下載、同一個URL下載次數控制和優化等特徵。使用示範的代碼:UITableView使用UIImageView+WebCache類(基本應用,UIImageView的一個category)前提#import導入UIImageView+WebCache.h文件,然後在tableview的cellForRowAtIndexPath:方法下:-(UITableViewCell*)tableView:(UITableView*):(NSIndexPath*)indexPath{staticNSString*MyIdentifier=@"MyIdentifier";UITableViewCell*cell=[:MyIdentifier];if(cell==nil){cell=[[UITableViewCellalloc]initWithStyle::MyIdentifier]autorelease];}//:methodtoloadthewebimage[cell.imageViewsetImageWithURL:[NSURLURLWithString:@"/path/to/image.jpg"]placeholderImage:[UIImageimageNamed:@"placeholder.png"];cell.textLabel.text=@"MyText";returncell;}基本代碼:[imageViewsetImageWithURL:[NSURLURLWithString:@"/path/image.jpg"];使用SDWebImageManager類:可以進行一些非同步載入的工作。SDWebImageManager*manager=[];UIImage*cachedImage=[managerimageWithURL:url];//將需要緩存的圖片載入進來if(cachedImage){//如果Cache命中,則直接利用緩存的圖片進行有關操作//Usethecachedimageimmediatly}else{//如果Cache沒有命中,則去下載指定網路位置的圖片,並且給出一個委託方法//Startanasyncdownload[managerdownloadWithURL:urldelegate:self];}當然你的類要實現SDWebImageManagerDelegate協議,並且要實現協議的webImageManager:didFinishWithImage:方法。//當下載完成後,調用回調方法,使下載的圖片顯示-(void)webImageManager:(SDWebImageManager*):(UIImage*)image{//}獨立的非同步圖像下載可能會單獨用到非同步圖片下載,則一定要用downloaderWithURL:delegate:來建立一個SDWebImageDownloader實例。downloader=[:urldelegate:self];這樣SDWebImageDownloaderDelegate協議的方法imageDownloader:didFinishWithImage:被調用時下載會立即開始並完成。獨立的非同步圖像緩存SDImageCache類提供一個創建空緩存的實例,並用方法imageForKey:來尋找當前緩存。UIImage*myCachedImage=[SDImageCachesharedImageCache]imageFromKey:myCacheKey];存儲一個圖像到緩存是使用方法storeImage:forKey:[SDImageCachesharedImageCache]storeImage:myImageforKey:myCacheKey];默認情況下,圖像將被存儲在內存緩存和磁碟緩存中。如果僅僅是想內存緩存中,要使用storeImage:forKey:toDisk:方法的第三個參數帶一負值來替代。SDWebImage支持非同步的圖片下載+緩存,提供了UIImageView+WebCacha的category,方便使用。紀錄一下SDWebImage載入圖片的流程。入口setImageWithURL:placeholderImage:options:會先把placeholderImage顯示,然後SDWebImageManager根據URL開始處理圖片。進入SDWebImageManager-downloadWithURL:delegate:options:userInfo:,交給SDImageCache從緩存查找圖片是否已經下載queryDiskCacheForKey:delegate:userInfo:.先從內存圖片緩存查找是否有圖片,如果內存中已經有圖片緩存,SDImageCacheDelegate回調imageCache:didFindImage:forKey:userInfo:到SDWebImageManager。SDWebImageManagerDelegate回調webImageManager:didFinishWithImage:到UIImageView+WebCache等前端展示圖片。如果內存緩存中沒有,生成NSInvocationOperation添加到隊列開始從硬碟查找圖片是否已經緩存。根據URLKey在硬碟緩存目錄下嘗試讀取圖片文件。這一步是在NSOperation進行的操作,所以回主線程進行結果回調notifyDelegate:。如果上一操作從硬碟讀取到了圖片,將圖片添加到內存緩存中(如果空閑內存過小,會先清空內存緩存)。SDImageCacheDelegate回調imageCache:didFindImage:forKey:userInfo:。進而回調展示圖片。如果從硬碟緩存目錄讀取不到圖片,說明所有緩存都不存在該圖片,需要下載圖片,回調imageCache:didNotFindImageForKey:userInfo:。共享或重新生成一個下載器SDWebImageDownloader開始下載圖片。圖片下載由NSURLConnection來做,實現相關delegate來判斷圖片下載中、下載完成和下載失敗。connection:didReceiveData:中利用ImageIO做了按圖片下載進度載入效果。connectionDidFinishLoading:數據下載完成後交給SDWebImageDecoder做圖片解碼處理。圖片解碼處理在一個NSOperationQueue完成,不會拖慢主線程UI。如果有需要對下載的圖片進行二次處理,最好也在這里完成,效率會好很多。在主線程:宣告解碼完成,imageDecoder:didFinishDecodingImage:userInfo:回調給SDWebImageDownloader。imageDownloader:didFinishWithImage:回調給SDWebImageManager告知圖片下載完成。通知所有的downloadDelegates下載完成,回調給需要的地方展示圖片。將圖片保存到SDImageCache中,內存緩存和硬碟緩存同時保存。寫文件到硬碟也在以單獨NSInvocationOperation完成,避免拖慢主線程。SDImageCache在初始化的時候會注冊一些消息通知,在內存警告或退到後台的時候清理內存圖片緩存,應用結束的時候清理過期圖片。SDWI也提供了UIButton+WebCache和MKAnnotationView+WebCache,方便使用。SDWebImagePrefetcher可以預先下載圖片,方便後續使用。SDWebImage庫的作用:通過對UIImageView的類別擴展來實現非同步載入替換圖片的工作。