2015-09-25 71 views
2

我試圖使用下面的方法加載3個圖像。問題是這樣的,我收到我的完成塊沒有錯誤,並且所有3個圖像僅在關閉我的detailedViewController並重新打開後才顯示。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; 


} 

在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並停止使用臨時UIImageView * img = [[UIimageVew alloc] init];

我去從:

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

要:

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

回答

0

這是一個併發問題。 SDWebImage已經是異步的,所以你通過自己的手動異步線程搞砸了它。

這裏是你在說什麼:

  1. 在新的後臺線程(線程A),開始下載圖像。
  2. 這個新的後臺線程(線程A)正在啓動它自己的後臺線程(線程B,SDWebImage正在爲你做這件事)。
  3. 您的背景主題A結束。
  4. dispatch_get_main_queue部分中的代碼會運行,但線程B仍處於下載這些映像的過程中,因此尚不可用。

他們下次出現的原因是因爲SDWebImage已經從第一次嘗試中緩存了它們。

要解決此問題,您應該將在dispatch_get_main_queue部分中運行的代碼移動到SDWebImage調用的completed塊中。

編輯:

您改變固定是因爲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]; ....沒有運氣我只有佔位符圖像,直到我重新加載VC。 – AhabLives

+0

@AhabLives查看我答案的更新。 –

+0

大謝謝@Mike的解釋。我討厭不理解爲什麼某些東西比其他東西更有效。 – AhabLives

相關問題