SDWebImage 下载后不显示(仅在重新打开 VController 后)

Posted

技术标签:

【中文标题】SDWebImage 下载后不显示(仅在重新打开 VController 后)【英文标题】:SDWebImage Not showing after download (only after reopening VController) 【发布时间】:2015-09-25 17:49:24 【问题描述】:

我正在尝试使用以下方法加载 3 张图片。问题是这样的,我的完成块没有收到任何错误,所有 3 张图像仅在我关闭 detailViewController 并重新打开后才会显示。

我错过了什么?感谢您的帮助,非常感谢。

- (UIImage*)loadImageFav1:(NSString *)nameEmail


       UIImageView *img =[[UIImageView alloc]init];
    //    NSString *strBack = [NSString stringWithFormat:@"%@%@%@", self.urlPrefix,[self.selectedProfile objectForKey:nameEmailPro],@"_B.png"];
    NSString *strProfi = [NSString stringWithFormat:@"%@%@%@", self.urlPrefix,nameEmail,@"_fav1.png"];
    //
    //    NSURL *bkgUrl = [NSURL URLWithString:[strBack stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
    NSURL *f1Url = [NSURL URLWithString:[strProfi stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
    //    // set imges below


    NSLog(@"selected fprofile ......str data...%@",strProfi);
    ////////strt

    weakImageViewF1= self.friendImageView1;
    [img sd_setImageWithURL:f1Url
           placeholderImage:[UIImage imageNamed:@"profile-1.jpg"]
                    options:SDWebImageRetryFailed
                  completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) 

                      NSLog(@"error...back..log %@", error);

                      if (image) 
                          // Update model to say that the image was downloaded

                          NSLog(@"Complete...Background...SSSSSS");

                          weakImageViewF1.image = image;
                          [weakImageViewF1 setNeedsLayout];
                      
                  ];
    //////
    // Test simple call
//    [img sd_setImageWithURL:f1Url placeholderImage:[UIImage imageNamed:@"profile-1.jpg"] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) 
//        if(error)
//            NSLog(@"Callback Error:%@",error);
//        
//        if(image)
//            NSLog(@"Callback Image:%@",image);
//        
//    ];


    return img.image;



调用 ViewDidAppear 中的所有 3 个图像

if ([self loadImageFav1:self.emailID] != nil) 

// call the same method on a background thread
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^

    UIImage *tmpF1 = [self loadImageFav1:self.emailID];
    UIImage *tmpF2 = [self loadImageFav2:self.emailID];
    UIImage *tmpF3 = [self loadImageFav3:self.emailID];

               // update UI on the main thread
    dispatch_async(dispatch_get_main_queue(), ^

        self.friendImageView1.image = tmpF1;
        self.friendImageView2.image = tmpF2;
        self.friendImageView3.image = tmpF3;


    );

);

///// 得到它的工作,但会喜欢一个解释 - 谢谢

为了让它正常工作,我直接将 sdWebImageWithURL 设置为我的原始 ImageView 并停止使用 temp UIImageView *img = [[UIimageVew alloc]init];

我来自:

[img sd_setImageWithURL:f1Url placeholderImage:[UIIm...

收件人:

[self.friendImageView1 sd_setImageWithURL:f1Url  placeholderImage:[UIIm...

【问题讨论】:

【参考方案1】:

这是一个并发问题。 SDWebImage 已经是异步的,所以你要通过自己的手动异步线程来搞砸它。

这就是你的意思:

    在新的后台线程(线程 A)中,开始下载图像。 这个新的后台线程(线程 A)正在启动它自己的后台线程(线程 B,SDWebImage 正在为您执行此操作)。 您的后台线程 A 结束。 dispatch_get_main_queue 部分中的代码运行,但线程 B 仍在下载这些图像,因此它们尚不可用。

它们下次出现的原因是因为 SDWebImage 从第一次尝试就已经缓存了它们。

要解决此问题,您应该将在 dispatch_get_main_queue 部分中运行的代码移动到 SDWebImage 调用的 completed 块中。

编辑:

您的更改修复的原因是因为 SDWebImage 负责将 UIImage 加载到您最初提供的 UIImageView 中。所以你最初是说“将此图像加载到我的名为imgUIImageView 中,并将该图像分配给我的另一个名为self.friendImageView1UIImageView”,但当时分配给img 的当前图像是占位符图像,因为尚未下载来自互联网的图像。就像我说的,SDWebImage 在后台线程中自动为您下载,下载完成后,它会将下载的图像分配给您调用它的UIImageView。所以基本上你的原始代码只是添加了一个额外的中间人。

【讨论】:

感谢您的帮助。我已经取出了后台线程,所以我的 viewDidAppear 现在看起来像这样...... self.friendImageView1.image = [self loadImageFav1:self.emailID]; self.friendImageView2.image = [self loadImageFav2:self.emailID]; self.friendImageView3.image = [self loadImageFav3:self.emailID];....不走运我只得到占位符图像,直到我重新加载 VC。 非常感谢@Mike 的解释。我讨厌不理解为什么某些东西比任何东西都更有效。

以上是关于SDWebImage 下载后不显示(仅在重新打开 VController 后)的主要内容,如果未能解决你的问题,请参考以下文章

AsyncTask(update) 仅在应用程序第一次打开时有效,但在 5 秒后不更新

缓存图像以供离线使用 SDWebImage

IntelliJ IDEA:重新打开 IDE 后不保留项目 SDK 设置

FragmentStatePagerAdapter 视图分页器片段在活动重新创建后不显示

保存后不显示个人资料图像(它只显示空白屏幕)

ARCGIS打开后不显示默认新建工程的界面,而是直接打开一个之前完成的工程,怎么调回到原来的初始界面?