2015-09-25 3 views
2

Я пытаюсь загрузить 3 изображения, используя приведенный ниже метод. Проблема в том, что я не получаю никаких ошибок из моего блока завершения, и все 3 изображения отображаются только после закрытия моего детального контрольного монитора и его повторного открытия.SDWebImage Не отображается после загрузки (только после повторного открытия VController)

Что мне не хватает? Спасибо за любую помощь, очень благодарен.

- (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; 


} 

вызова все 3 изображения в ViewDidAppear

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; 


    }); 

}); 

}

///// GOT IT работает, но ПОЛЮБИЛИ экспликации - БЛАГОДАРЯ

Так, чтобы это заработало я сначала установите sdWebImageWithURL в мой оригинальный ImageView и остановитесь с помощью temp UIImageView * img = [[UIimageVew alloc] init];

Я пошел от:

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

To:

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

ответ

0

Это проблема параллелизм. SDWebImage уже асинхронен, поэтому вы закручиваете его, выполняя собственный асинхронный поток вручную.

Вот что вы говорите:

  1. В новом фоновом потоке (Thread A), начать загрузку изображений.
  2. Этот новый фоновый поток (Thread A) запускает собственный поток фона (Thread B, SDWebImage делает это для вас).
  3. Ваш фон Нить A заканчивается.
  4. Код в вашем разделе dispatch_get_main_queue выполняется, но Thread B все еще находится в процессе загрузки этих изображений, чтобы они еще не были доступны.

Причина, по которой они появляются в следующий раз, заключается в том, что SDWebImage уже кэшировал их с первой попытки.

Чтобы устранить эту проблему, вы должны переместить код, который выполняется в разделе dispatch_get_main_queue, в блок completed для вызова SDWebImage.

EDIT:

Причина, что изменение фиксированной это происходит потому, что SDWebImage заботится о загрузке UIImage в UIImageView, что вы дали его в первую очередь. Итак, вы изначально говорили: «Загрузите это изображение в мой UIImageView с именем img, а также присвойте это изображение другому моему UIImageView с именем self.friendImageView1», но в момент времени текущее изображение, присвоенное img, было образцом-заполнителем, поскольку тот, который был из Интернета еще не скачали. Как я уже сказал, SDWebImage автоматически загружает вас в фоновом потоке, и когда загрузка выполняется, он присваивает загруженное изображение этому UIImageView, на который вы его вызывали. Таким образом, в основном ваш исходный код просто добавил дополнительного посредника.

+0

Спасибо за помощь.Я извлек фоновый поток, так что теперь мой viewDidAppear выглядит так: self.friendImageView1.image = [self loadImageFav1: self.emailID]; self.friendImageView2.image = [self loadImageFav2: self.emailID]; self.friendImageView3.image = [self loadImageFav3: self.emailID]; .... Нет Luck Я получаю только изображение заполнителя, пока не перезагружу VC. – AhabLives

+0

@AhabLives видит обновление моего ответа. –

+0

Большое спасибо @Mike за объяснение. Я ненавижу не понимать, почему что-то работает больше всего на свете. – AhabLives

Смежные вопросы