近日使用SDWebImage来加载并缓存图片,本人希望能在图片异步加载完成的时候用一个变量取到图片数据。但是在新版本的方法中是使用Block来进行回调的,讨教高手,这个Block方法该怎么写。- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder options:(SDWebImageOptions)options progress:(SDWebImageDownloaderProgressBlock)progressBlock completed:(SDWebImageCompletedBlock)completedBlock本人用的是这个方法,但是在写completedBlock的时候总是会报错,不知道错在哪里.
这是本人写的代码
这是报的错
另外请教这几个方法有什么区别啊
这是本人写的代码
这是报的错
另外请教这几个方法有什么区别啊
解决方案
20
上图中的cacheType 实际应该是一个枚举类型,而你在使用时多加了个 * ,去掉就可以了, 如下这块:
completed:^ (UIImage *im, NSError *error, SDImageCacheType type) {}
5
假如数组在得到时是有序的,那么在显示数组中的图片时应该不会出现你说的列表顺序乱了。使用相似的第三方图片加载的库,一般都会提供一个占位的image, 也就是上面的函数中的placeholderImage. 在远程图片未被下载完显示之前,你先看到的会是这个占位的image, 当图片下载完成后会更新UI线程上更新这个image。
15
你是将cell中的三张图片放到一个数组中吗? 显示的图片和点击的图片不符是原因是取的不对吧。假如能找到点击图片的下标索引去数组中去读取图片对象,应该是相对应的。你可以创建一个缓存对象NSArray 来保存已经加载出的图片
///////创建缓存NSMutalbeArray
NSMutalbeArray *cacheImage = [NSMutableArray alloc] init]; int count= yourImagescount; /////// for (int i=0; i<count; i++) { [cacheImage addObject:[NSNull null]]; }
上面是根据图片数组的大小创建的缓存对象,下面就是当异步加载出来图片后来替换相应的缓存对象
if (image!=nil) { [cacheImage replaceObjectAtIndex:XXX withObject:image]; }
这样在显示大图时就可以从这个cacheImage中来取图片对象了
UIImage *image= cacheImage[XXX]; ////XXX是当前点击的图片索引 if (image==[NSNull null]) { //////////说明还没有被异步加载完毕 NSLog(@"image is loading"); }else { NSLog(@"show image") }