我正在使用名为DFImageManager
的lib,我不太确定我会以正确的方式使用它。
我被认为在requestImageForRequest
的完成块内info
可以用来检测请求是否成功。
但是,info
为nil
的时间有10%,image
有值。
info
param的用途是什么?当info
为nil
时,我仍然可以使用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
}
}];
答案 0 :(得分:2)
保证在主线程上调用完成块。当可以从内存缓存中检索所请求的图像并且在主线程上发出请求时,将同步调用完成块。
info
为nil
时就是这种情况。该实现类似于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
应为nonnull
。 info
应为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);
}
}];