2015-06-18 47 views
0

我正在使用一個名爲DFImageManager的庫,我不太確定我是否正確地使用它。我在DFImageManager上正確使用requestImageForRequest嗎?

我被引導認爲在requestImageForRequest的完成塊內可以使用info來檢測請求是否成功。

但是,infonil但是image有10%的時間值。

info param的用途是什麼?當infonil時,我仍然可以使用值image

DFImageRequestOptions *options = [[DFImageRequestOptions alloc] init]; 
options.expirationAge = 60; 

DFImageRequest *request = [DFImageRequest requestWithResource:[NSURL URLWithString:imageURL] targetSize:imageView.frame.size contentMode:DFImageContentModeAspectFill options:options]; 

[[DFImageManager sharedManager] requestImageForRequest:request completion:^(UIImage *image, NSDictionary *info) { 

     if (info != nil) { 

      [imageView setImage:image]; 
     } 
     else { 

      // use a placeholder 
     } 
}]; 

回答

2

完成塊保證在主線程上被調用。當可以從內存緩存中檢索到請求的圖像並且在主線程上發出請求時,將同步調用完成塊。

這是infonil的情況。該實現類似於PHImageManager,它有時根據請求同步地調用完成塊(而不是異步)。這是必要的,以便您可以重新加載您的UI,而無需擔心在圖像在內存緩存中實際可用時繪製具有空圖像視圖的幀。並且一個單一的requestImageForRequest方法保持內存緩存對客戶端透明。

什麼信息參數是?

如果在存在錯誤時存在錯誤(請參閱DFImageInfoErrorKey鍵)。和一個requestID(DFImageInfoRequestIDKey)。但是,當請求由內存緩存處理時,信息是零。

當信息爲零時,我還可以使用圖像的值嗎?

是的,你可以。您應經常檢查,如果圖像是不是nil而不是檢查信息:

if (image != nil) { 
    [imageView setImage:image]; 
} else { 
    // use a placeholder 
    NSError *error = info[DFImageInfoErrorKey]; 
    // handle a specific error (if there is one) 
} 

我打算讓事情變得更加明顯與空性的下一個版本:

  • requestID應該是nonnullinfo應該是nonnull(即使請求可以由內存緩存處理)並且應始終包含requestID
  • request及其resource應都是nonnull
  • 當請求無效時(不受支持的資產),映像管理器應引發異常。
0

我對我的iWatch應用程序使用DFImageManager並且工作正常!很好! 快速加載圖像。 我希望能幫到你。

代碼:

NSURL *imageURL = [NSURL URLWithString:dataObject.thumbnail]; 

     DFImageRequestOptions *options = [DFImageRequestOptions new]; 
     options.allowsClipping = YES; 
     options.progressHandler = ^(double progress){ 
      // Observe progress 
     }; 
     options.userInfo = @{ DFURLRequestCachePolicyKey : @(NSURLRequestReturnCacheDataDontLoad) }; 

     DFImageRequest *request = [DFImageRequest requestWithResource:imageURL targetSize:CGSizeMake(100.f, 100.f) contentMode:DFImageContentModeAspectFill options:options]; 

     [[DFImageManager sharedManager] requestImageForRequest:request completion:^(UIImage *image, NSDictionary *info) { 
      // Image is resized and clipped to fill 100x100px square 

      if (info != nil) { 

       [self.iboGroup setBackgroundImage:image]; 

      }else 
      { 
       NSError *error = info[DFImageInfoErrorKey]; 
       NSLog(@"error %@", error); 
      } 

     }]; 
+0

謝謝你,但它不是我問。 @kean(lib的創建者)提供了正確的答案。 – thedp

+0

:S!你是對的 –