用sdwebimge加载图片,时候发现一个奇怪的问题:代码如下(A),发现无法重新绘制UIImageView
UIImageView *image=[[UIImageView alloc]initWithFrame:CGRectMake(0, 0, self.Postwidth, self.Postheight-64)];
image.backgroundColor =[UIColor orangeColor];
[imagesd_setImageWithURL:[NSURLURLWithString:self.urlstr]completed:^(UIImage*image,NSError*error,SDImageCacheTypecacheType,NSURL*imageURL) {
if(!error) {
CGFloatimgW = image.size.width;
CGFloatimgH = image.size.height;
weakSelf.Postheight= (self.Postwidth/imgW)*imgH +64;
weakSelf.postview.frame=CGRectMake((SCREEN_WIDTH-self.Postwidth)/2,30,self.Postwidth,self.Postheight);
weakSelf.imgView.frame=CGRectMake(0,0,self.Postwidth,self.Postheight-64);
weakSelf.scoller.contentSize=CGSizeMake(self.Postwidth, weakSelf.Postheight+30);
}
}];
self.imgView=image;
[_postviewaddSubview:image];
如果在回调里用主线程去重新绘制又是正常的,代码如下(B)
UIImageView *image=[[UIImageView alloc]initWithFrame:CGRectMake(0, 0, self.Postwidth, self.Postheight-64)];
image.backgroundColor =[UIColor orangeColor];
[imagesd_setImageWithURL:[NSURLURLWithString:self.urlstr]completed:^(UIImage*image,NSError*error,SDImageCacheTypecacheType,NSURL*imageURL) {
if(!error) {
dispatch_async(dispatch_get_main_queue(), ^{
CGFloatimgW = image.size.width;
CGFloatimgH = image.size.height;
weakSelf.Postheight= (self.Postwidth/imgW)*imgH +64;
weakSelf.postview.frame=CGRectMake((SCREEN_WIDTH-self.Postwidth)/2,30,self.Postwidth,self.Postheight);
weakSelf.imgView.frame=CGRectMake(0,0,self.Postwidth,self.Postheight-64);
weakSelf.scoller.contentSize=CGSizeMake(self.Postwidth, weakSelf.Postheight+30);
});
}
}];
self.imgView=image;
[_postviewaddSubview:image];
我猜测是不是回调不是是主线程,所以没有进行UI绘制,手动去设置回调里添加[weakSelf.imgView setNeedsLayout];
结果无效。然后进行打断点,发现回调里self.imgView =nil;也就是是赋值没成功。尝试换了赋值的位置
把self.imgView=image;赋值代码提到imagesd_setImageWithURL:... 之前 具体如下(C)
UIImageView *image=[[UIImageView alloc]initWithFrame:CGRectMake(0, 0, self.Postwidth, self.Postheight-64)];
self.imgView=image;
// [image sd_setImageWithURL:[NSURL URLWithString:self.urlstr]];
image.backgroundColor =[UIColor orangeColor];
[imagesd_setImageWithURL:[NSURLURLWithString:self.urlstr]completed:^(UIImage*image,NSError*error,SDImageCacheTypecacheType,NSURL*imageURL) {
if(!error) {
CGFloatimgW = image.size.width;
CGFloatimgH = image.size.height;
weakSelf.Postheight= (self.Postwidth/imgW)*imgH +64;
weakSelf.postview.frame=CGRectMake((SCREEN_WIDTH-self.Postwidth)/2,30,self.Postwidth,self.Postheight);
weakSelf.imgView.frame=CGRectMake(0,0,self.Postwidth,self.Postheight-64);
weakSelf.scoller.contentSize=CGSizeMake(self.Postwidth, weakSelf.Postheight+30);
}
}];
[_postviewaddSubview:image];
惊奇的发现又可以绘制了。于是有了这样的猜测:加载图片时候主线程开辟子线程时候打了个锚点,执行回调方法是回到了锚点位置,也就是主线程并未对 self.imgView赋值的位置,所以回调执行时 self.imgView是空的。而用获取主线程来执行是获取了主线程最新状态也就是self.imgView过赋值了,所以可以获取self.imgView进行重绘。
图(图丑见谅)解如下:
以上是我的猜测,仅供参考。欢迎指点纠正。
网友评论