YYWebImage調用方法:
UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, hotelRatingView.frame.origin.y+hotelRatingView.frame.size.height+10, 200, 100)];
[self.view addSubview:imageView];
NSURL *url = [NSURL URLWithString:@"http://ppt360.com/background/UploadFiles_6733/201012/2010122016330331.jpg"];
[imageView yy_setImageWithURL:url
placeholder:nil
options:YYWebImageOptionSetImageWithFadeAnimation
progress:^(NSInteger receivedSize, NSInteger expectedSize) {
NSLog(@"圖片的size :%ld ,期望的尺寸:%ld",(long)receivedSize,(long)expectedSize);
}
transform:^UIImage *(UIImage *image, NSURL *url) {
image = [image yy_imageByResizeToSize:CGSizeMake(100, 100) contentMode:UIViewContentModeCenter];
return [image yy_imageByRoundCornerRadius:10];
}
completion:^(UIImage *image, NSURL *url, YYWebImageFromType from, YYWebImageStage stage, NSError *error) {
[imageView setImage:image];
if (from == YYWebImageFromDiskCache) {
NSLog(@"load from disk cache");
}
}];
為什么在completion我就更新UI了?難道不用考慮是不是在主線程做UI操作嗎?請看源碼:
dispatch_async(dispatch_get_main_queue(), ^{
if (setImage && self) {
if (showFade) {
CATransition *transition = [CATransition animation];
transition.duration = stage == YYWebImageStageFinished ? _YYWebImageFadeTime : _YYWebImageProgressiveFadeTime;
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
transition.type = kCATransitionFade;
[self.layer addAnimation:transition forKey:_YYWebImageFadeAnimationKey];
}
self.image = image;
}
if (completion) completion(image, url, from, stage, error);
});
已經設計好了,所以不用你考慮了。由此類推,如果你的AFNetworking封裝,如果請求相應之后沒有返回主線程,那么就別在子線程中去創建UI。當然這樣做本來就不合理。
效果如下
image.png