2

我使用 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 ") 是否中断.so indicatorView 始终存在。为什么方法没有调用完成的块?

4

1 回答 1

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

于 2013-05-14T10:03:31.390 回答