sdwebImage setImageWithURL:placeholderImage:completed:

时间:2013-05-14 08:53:14

标签: iphone sdwebimage

我使用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始终存在。为什么方法没有调用块完成?

1 个答案:

答案 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只会在第一次调用时(发生错误时)。