我使用SDWebImage新版本并致电:
self.imgIndicatorView.center=self.img.center;
self.imgIndicatorView.hidden=NO;
[ self.imgIndicatorView startAnimating];
__block UIActivityIndicatorView *indicatorView= self.imgIndicatorView;
NSLog(@"myTopics.img.small=%@",myTopics.img.small);
[self.img setImageWithURL:[NSURL URLWithString:@"http://ww1.sinaimg.cn/thumbnail/acc940bdj.jpg"]
placeholderImage:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType){
NSLog(@"newImageNotCached:break.png myTopics.img.small" );
if(!error ){
CGRect sFrame=self.img.frame;
CGSize newSize=image.size;
if (newSize.height>80) {
if (newSize.width>newSize.height) {
newSize.height=newSize.height *80.0/image.size.width;
newSize.width=80;
}else{
newSize.height=80;
newSize.width=newSize.width*80.0/image.size.height;
}
}else{
if (newSize.width>80) {
newSize.height=newSize.height *80.0/image.size.width;
newSize.width=80;
}else{
}
}
sFrame.size=newSize;
self.img.frame=sFrame;
indicatorView.hidden=YES;
[indicatorView stopAnimating];
[indicatorView removeFromSuperview];
}else{
self.img.image=[UIImage newImageNotCached:@"break.png"];
indicatorView.hidden=YES;
[indicatorView stopAnimating];
[indicatorView removeFromSuperview];
}
}];
但有时日志NSLog(@“newImageNotCached:break.png myTopics.img.small”),如果url(@“http://ww1.sinaimg.cn/thumbnail/acc940bdj.jpg”)是break,则不显示。因此indicatorView始终存在。为什么方法没有调用块完成?
答案 0 :(得分:1)
在。 UIImageView + WebCache.m第55行。
if (url)
{
__weak UIImageView *wself = self;
id<SDWebImageOperation> operation = [SDWebImageManager.sharedManager downloadWithURL:url options:options progress:progressBlock completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished)
{
__strong UIImageView *sself = wself;
if (!sself) return;
if (image)
{
sself.image = image;
[sself setNeedsLayout];
}
if (completedBlock && finished) // NOTE: finished == YES, the completedBlock could be called.
{
completedBlock(image, error, cacheType);
}
}];
objc_setAssociatedObject(self, &operationKey, operation, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
在SdwebImageManager.m第81行
if (!url || !completedBlock || (!(options & SDWebImageRetryFailed) && [self.failedURLs containsObject:url])) // NOTE: failedURLs contain the url
{
// TIPS: ERROR OCCURED, DO NOTHING
if (completedBlock) {
// NOTE: finished flag was NO. Please set it as YES, And try again.
completedBlock(nil, nil, SDImageCacheTypeNone, NO);
}
return operation;
}
所以你写的completedBlock只会在第一次调用时(发生错误时)。