我在DFImageManager上正确使用了requestImageForRequest吗?

时间:2015-06-18 23:53:01

标签: ios objective-c

我正在使用名为DFImageManager的lib,我不太确定我会以正确的方式使用它。

我被认为在requestImageForRequest的完成块内info可以用来检测请求是否成功。

但是,infonil的时间有10%,image有值。

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

答案 0 :(得分:2)

  

保证在主线程上调用完成块。当可以从内存缓存中检索所请求的图像并且在主线程上发出请求时,将同步调用完成块。

infonil时就是这种情况。该实现类似于PHImageManager,它有时会根据请求同步(而不是异步)调用完成块。这是必要的,以便您可以重新加载UI,而无需担心在内存缓存中实际可用图像时使用空图像视图绘制帧。并且单个requestImageForRequest方法使内存缓存对客户端保持透明。

  

信息参数的用途是什么?

如果有错误,则会出现错误(请参阅DFImageInfoErrorKey键)。还有一个requestID(DFImageInfoRequestIDKey)。但是当请求由内存缓存处理时,信息为nil。

  

当信息为零时,我仍然可以使用图像的值吗?

是的,你可以。您应该始终检查图像是否不是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
  • 图像管理器应在请求无效时引发异常(不支持的资产)。

答案 1 :(得分: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);
            }

        }];