无限互联SDWebImage图片缓存流程分析_第1页
无限互联SDWebImage图片缓存流程分析_第2页
无限互联SDWebImage图片缓存流程分析_第3页
无限互联SDWebImage图片缓存流程分析_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、【无限互联】sdwebimage图片缓存流程分析sdwebimage是一个功能很强大的缓存网络图片的框架。框架实现了异步加载网络图片、自动缓存图片数据等功能。以uiimageview加载网络图片为例,对其总体的加载图片流程做一个大致的分析。 首先使用sdwebimage先要导入 #import uiimageview+webcache.h文件,设置网络图片的图片地址就可以加载图片。objc view plaincopyprint?1. nsurl *url = nsurl urlwithstring: 2. imageview setimagewithurl:url; 根据网络图片地址,sdw

2、ebimagemanager类提供了方法downloadwithurl加载图片objc view plaincopyprint?1. id operation = sdwebimagemanager.sharedmanager downloadwithurl:url options:options progress:progressblock completed:(uiimage *image, nserror *error, sdimagecachetype cachetype, bool finished) 2. if (!wself) return; 3. dispatch_main_s

3、ync_safe( 4. if (!wself) return; 5. if (image) 6. wself.image = image; 7. wself setneedslayout; 8. 9. if (completedblock & finished) 10. completedblock(image, error, cachetype); 11. 12. ); 13. ; 14. objc_setassociatedobject(self, &operationkey, operation, objc_association_retain_nonatomic); 15. id o

4、peration = sdwebimagemanager.sharedmanager downloadwithurl:url options:options progress:progressblock completed:(uiimage *image, nserror *error, sdimagecachetype cachetype, bool finished) if (!wself) return; dispatch_main_sync_safe( if (!wself) return; if (image) wself.image = image; wself setneedsl

5、ayout; if (completedblock & finished) completedblock(image, error, cachetype); ); ; objc_setassociatedobject(self, &operationkey, operation, objc_association_retain_nonatomic); 进入downloadwithurl方法,由sdimagercache类提供方法querydiskcacheforkey检查内存中是否有图片缓存,如果有图片缓存,回调block将图片数据传递给sdwebimagemanger类。sdwebimage

6、mange类回调block将图片数据传递给uiimageview+webcache类去显示图片。objc view plaincopyprint?1. uiimage *image = self imagefrommemorycacheforkey:key; 2. if (image) 3. doneblock(image, sdimagecachetypememory); 4. return nil; 5. uiimage *image = self imagefrommemorycacheforkey:key; if (image) doneblock(image, sdimagecach

7、etypememory); return nil; 如果内存中没有图片缓存,将会去磁盘中查找图片缓存。这一步操作是异步操作,如果从磁盘中读取到图片数据,将图片数据添加到内存缓存中,回调block将图片数据传递给sdwebimagemanger类。 sdwebimagemange类回调block将图片数据传递给uiimageview+webcache类去显示图片objc view plaincopyprint?1. dispatch_async(self.ioqueue, 2. if (operation.iscancelled) 3. return; 4. 5.6. autoreleasepo

8、ol 7. uiimage *diskimage = self diskimageforkey:key; 8. if (diskimage) 9. cgfloat cost = diskimage.size.height * diskimage.size.width * diskimage.scale; 10. self.memcache setobject:diskimage forkey:key cost:cost; 11. 12.13. dispatch_async(dispatch_get_main_queue(), 14. doneblock(diskimage, sdimageca

9、chetypedisk); 15. ); 16. dispatch_async(self.ioqueue, if (operation.iscancelled) return; autoreleasepool uiimage *diskimage = self diskimageforkey:key; if (diskimage) cgfloat cost = diskimage.size.height * diskimage.size.width * diskimage.scale; self.memcache setobject:diskimage forkey:key cost:cost

10、; dispatch_async(dispatch_get_main_queue(), doneblock(diskimage, sdimagecachetypedisk); ); 内存和磁盘中都没有图片缓存,由sdwebimagedownloader类downloadimagewithurl方法请求网络下载图片。objc view plaincopyprint?1. - (id )downloadimagewithurl:(nsurl *)url options:(sdwebimagedownloaderoptions)options progress:(void ()(nsinteger,

11、 nsinteger)progressblock completed:(void ()(uiimage *, nsdata *, nserror *, bool)completedblock 2. - (id )downloadimagewithurl:(nsurl *)url options:(sdwebimagedownloaderoptions)options progress:(void ()(nsinteger, nsinteger)progressblock completed:(void ()(uiimage *, nsdata *, nserror *, bool)comple

12、tedblock 图片下载完成后,数据下载完成后交给 sdwebimagedecoder 做图片解码处理,图片解码完成后回调给sdwebimagedownloader类,sdwebimagedownloader类,回调block将图片数据传递给sdwebimagemanger类。 sdwebimagemange类回调block将图片数据传递给uiimageview+webcache类显示图片。图片数据会写入到内存和磁盘缓存中。图片数据写入磁盘缓存中是异步操作,避免拖慢主线程。objc view plaincopyprint?1. - (void)storeimage:(uiimage *)im

13、age recalculatefromimage:(bool)recalculate imagedata:(nsdata *)imagedata forkey:(nsstring *)key todisk:(bool)todisk 2. if (!image | !key) 3. return; 4. 5. self.memcache setobject:image forkey:key cost:image.size.height * image.size.width * image.scale; 6. if (todisk) 7. dispatch_async(self.ioqueue,

14、8. nsdata *data = imagedata; 9.10. if (image & (recalculate | !data) 11. bool imageispng = yes; 12. if (imagedata length = kpngsignaturedata length) 13. imageispng = imagedatahaspngpreffix(imagedata); 14. 15. if (imageispng) 16. data = uiimagepngrepresentation(image); 17. 18. else 19. data = uiimage

15、jpegrepresentation(image, (cgfloat)1.0); 20. 21. data = nsbitmapimagerep representationofimagerepsinarray:image.representations usingtype: nsjpegfiletype properties:nil; 22. 23. if (data) 24. if (!_filemanager fileexistsatpath:_diskcachepath) 25. _filemanager createdirectoryatpath:_diskcachepath wit

16、hintermediatedirectories:yes attributes:nil error:null; 26. 27. _filemanager createfileatpath:self defaultcachepathforkey:key contents:data attributes:nil; 28. 29. ); 30. 31. - (void)storeimage:(uiimage *)image recalculatefromimage:(bool)recalculate imagedata:(nsdata *)imagedata forkey:(nsstring *)k

17、ey todisk:(bool)todisk if (!image | !key) return; self.memcache setobject:image forkey:key cost:image.size.height * image.size.width * image.scale; if (todisk) dispatch_async(self.ioqueue, nsdata *data = imagedata; if (image & (recalculate | !data) bool imageispng = yes; if (imagedata length = kpngs

18、ignaturedata length) imageispng = imagedatahaspngpreffix(imagedata); if (imageispng) data = uiimagepngrepresentation(image); else data = uiimagejpegrepresentation(image, (cgfloat)1.0); data = nsbitmapimagerep representationofimagerepsinarray:image.representations usingtype: nsjpegfiletype properties:nil; if (data) if (!_filemanager fileexistsatpath:_diskcachepath) _filemanager createdirectoryatpath:_diskcachepath withintermediatedirectories:yes attributes:nil error:null; _filemanag

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论