sd_setImageWithURL:placeholderImage:options:progress:completed:
这个是最核心的调用方法,placeholderImage:options:progress:completed 这几个参数都是可以不要的.
SDWebImageOptions可以传入多个参数
SDWebImageRetryFailed 默认失败的url被记录,下次就不在下载,这个option会继续下载. SDWebImageLowPriority 默认UI交互的时候开始下载,这个option会延后下载,等UIScrollView减速后 SDWebImageCacheMemoryOnly 只混存,不存入磁盘 SDWebImageProgressiveDownload 默认图片下载完成才显示一次,这个option是显示渐进式下载,边下边显示的. SDWebImageRefreshCached 刷新缓存,相同的url,还是会重新下载 SDWebImageContinueInBackground 后台下载 SDWebImageHandleCookies NSMutableURLRequest.HTTPShouldHandleCookies = YES SDWebImageAllowInvalidSSLCertificates 允许使用未信任的证书,一般用于测试,生成模式时需要注意 SDWebImageHighPriority 优先下载 SDWebImageDelayPlaceholder 延迟占位图,默认是下载过程中就用占位图,这个会等下载完成之后. SDWebImageTransformAnimatedImage 改变动画形象,但是需要自己去实现代理方法 SDWebImageAvoidAutoSetImage 得到图片之后不会立即设置imageView,你需要自己操作。
progress与completed是两个block
progress:^(NSInteger receivedSize, NSInteger expectedSize) completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL)
根据回传的东西可以做自己想要的操作,比如进度条显示,比如完成之后做个什么显示之类的。
sd_cancelCurrentImageLoad
取消当前的下载
利用runtime,objc_setAssociatedObject给imageUrl赋值
如果是延迟占位图 就先设置imageView的image
然后判断url是否为空 当为空的时候 直接调用completedBlock
不为空就先看ActivityIndicatorView是否show,这个应该是在调用sd_setImageWithURL之前就对imageView设置了的
调用@selector(downloadImageWithURL:options:progress:completed:)
创建SDWebImageCombinedOperation实例,completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL)
里则是根据获取图片刷新界面的操作
@selector(downloadImageWithURL:options:progress:completed:)
方法中先在缓存中读取图片,未读到就到磁盘中去读取。这里就又要根据option看代码怎么走了。就可能出现如果是之前调用的url并未获取到图片,则不再请求,获取取到了图片,就直接读取缓存,也不请求了。还有失败的url是否保存。然后 @selector(downloadImageWithURL:options:progress:completed:)
创建Operation添加到queue里开始执行. 根据connection的调的代理方法回调block,执行block里面的代码,当error的时候把url加入到self.failedURLs,根据option来决定是否移除url或者保存image方式。同时也发送了通知开始下载,正在接受数据,停止下载,完成下载,但是发现监听调用的是 动态加载的实例方法,而且只有ActivityIndicator的show和stop.并没有全运用起来
大致看了看整个流程,SDWebimage高度封装 使用起来十分方便,大概流程看到的就是这样吧,更细节的地方下次再来看。注意SDWebImageOptions的选择。
另外有一个收获是看SDWebImageContinueInBackground
发现的,进入后台之后还可以执行代码,可以调用UIApplication的beginBackgroundTaskWithExpirationHandler:
实例方法,来向iOS 借点时间这个就单独再记录一篇。