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

时间:2015-09-25 17:49:25

标签: ios objective-c uiimageview sdwebimage

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

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

- (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 个答案:

答案 0 :(得分:0)

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

以下是您所说的内容:

  1. 在新的后台线程(线程A)中,开始下载图像。
  2. 这个新的后台线程(线程A)正在启动它自己的后台线程(线程B,SDWebImage正在为你做这个)。
  3. 您的后台主题A结束。
  4. 您的dispatch_get_main_queue部分中的代码会运行,但主题B仍在下载这些图片,因此它们尚不可用。
  5. 他们下次出现的原因是因为SDWebImage已经从第一次尝试中缓存了它们。

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

    编辑:

    您的更改修复它的原因是SDWebImage负责将UIImage加载到您首先提供的UIImageView中。所以你最初说'#34;将此图片加载到名为UIImageView的{​​{1}}中,并将该图片分配给名为img"的其他UIImageView,但是在分配给self.friendImageView1的当前图像的时间点是占位符图像,因为来自互联网的图像尚未下载。就像我说的那样,SDWebImage会在后台线程中自动为您下载,下载完成后,它会将下载的图像分配给您调用它的img。所以基本上你的原始代码只是添加了一个额外的中间人。