需求: 类似QQ列表的头像加载刷新,判断在线离线状态改变头像,以及彩色头像灰色处理,下载图片+获取在线状态需要连网--再改变头像
问题:由于cell的复用以及下拉刷新数据每次加载10条数据,会出现头像赋值不正确,位置偏移大小不同的变化
原因:由于cell的重复调用,加载数据方法已经赋值方法也在重复的调用,所以头像加载 在线状态判断好后,网络延迟,
(个人开始yy:启动时的cell和赋值结束的cell可能不是同一个)
修改:当cell开始调用的时候,给当前的cell赋tag值,加载结束判断是不是自己的tag:不是了跳过是了赋值。反正可以解决问题
避免头像的重复加载,更换:由于每次进来都要重新加载一组新的头像,并没有做本地化处理;
处理:在控制器中添加一个可变的字典dict ; dict= {@"0":image,@"1":image,@"2":image,@"3":@"default",@"lasttime":@"0/1/2"}
0是离线的image;1在线;2忙碌;3有值(使用默认头像,不存入字典);lasttime 记录上一次的状态,刷新时首先显示上一次的状态值,刷新状态后:对比上一次,
如果和上一次不一样了在更换;
不足之处多多指教。
//头像灰化处理
//置灰
+(UIImage*)createGrayCopy:(UIImage*)source{
int width = source.size.width;
int height = source.size.height;
CGColorSpaceRef colorSpace =CGColorSpaceCreateDeviceGray();
CGContextRef context =CGBitmapContextCreate(nil,
width,
height,
8,// bits per component
0,
colorSpace,
kCGBitmapByteOrderDefault);
CGColorSpaceRelease(colorSpace);
if(context ==NULL) {
return nil;
}
CGContextDrawImage(context,
CGRectMake(0,0, width, height), source.CGImage);
UIImage*grayImage = [UIImage imageWithCGImage:CGBitmapContextCreateImage(context)];
CGContextRelease(context);
return grayImage;
}
////////显示头像优先显示字典中的,字典为空显示 加载数据中,保存彩色、灰色到字典中
在viewdidload中初始化arrayAllImage大字典,以及默认图片
NSMutableDictionary * dicc = arrayAllImage[model.uid];
if (dicc.allKeys.count>0) {
//之前保存过值
if ([dicc[lasttime] isEqualToString:@"1"]) {
//在线
if (dicc[@"3"]) {
//如果没有自己的头像
cell.imageview.image = imagehold;
}else{
cell.imageview.image = dicc[@"1"];
}
cell.busyOr.hidden = YES;
}else if ([dicc[lasttime] isEqualToString:@"0"]) {
//如果不在线 先判断之前有没有保存过 不在线的值
if (dicc[@"3"]) {
//如果没有自己的头像
cell.imageview.image = graimage;
}else{
cell.imageview.image = dicc[@"0"];
}
cell.busyOr.hidden = YES;
//没有保存了生成值
}
else if ([dicc[lasttime] isEqualToString:@"2"]) {
if (dicc[@"3"]) {
//如果没有自己的头像
cell.imageview.image = imagehold;
}else{
cell.imageview.image = dicc[@"1"];
}
cell.busyOr.hidden = NO;
}
}else{
//没有值
if ([model.status isEqualToString:@"1"]) {
dicc =[NSMutableDictionary dictionary];
//在线
[cell.imageview sd_setImageWithURL:[NSURL URLWithString:model.headimage] placeholderImage:
[UIImage imageNamed:HeadPortraitDoctor]];
if (model.headimage.length>0) {
//判断 是否有自己的头像,如果有了 加载
UIImage * image =[UIImage createGrayCopy:cell.imageview.image];
[dicc setObject:image forKey:@"0"];
[dicc setObject:cell.imageview.image forKey:@"1"];
}else{
//没有了 直接添加字典@“3” 下次判断,显示
[dicc setObject:@"default" forKey:@"3"];
}
[dicc setObject:@"1" forKey:lasttime];
[arrayAllImage setObject:dicc forKey:model.uid];
cell.busyOr.hidden = YES;
}
else if([model.status isEqualToString:@"0"]){
//不在线
cell.busyOr.hidden = YES;
dicc =[NSMutableDictionary dictionary];
UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:model.headimage]]];
NSLog(@"%@",model.headimage);
if (model.headimage.length>0) {
cell.imageview.image = [UIImage createGrayCopy:image];
[dicc setObject:image forKey:@"1"];
[dicc setObject:cell.imageview.image forKey:@"0"];
}else{
cell.imageview.image=graimage ;
[dicc setObject:@"default" forKey:@"3"];
}
[dicc setObject:@"0" forKey:lasttime];
[arrayAllImage setObject:dicc forKey:model.uid];
}
else if([model.status isEqualToString:@"2"]){
//忙碌
dicc =[NSMutableDictionary dictionary];
//在线
[cell.imageview sd_setImageWithURL:[NSURL URLWithString:model.headimage] placeholderImage:
[UIImage imageNamed:HeadPortraitDoctor]];
if (model.headimage.length>0) {
UIImage * image =[UIImage createGrayCopy:cell.imageview.image];
[dicc setObject:image forKey:@"0"];
[dicc setObject:cell.imageview.image forKey:@"1"];
}else{
[dicc setObject:@"default" forKey:@"3"];
}
[dicc setObject:@"2" forKey:lasttime];
[arrayAllImage setObject:dicc forKey:model.uid];
cell.busyOr.hidden = NO;
}
}
if(!ScrollerYesNo){
//给图片标记
cell.imageview.tag = indexPath.row+200;
[[GetUrlSession shareUrlconnection]connetion:[NSString stringWithFormat:@"%@?uid=%rt=%@",seartatusGet,mod,model.port] Haget:^(NSDictionary *data, NSError *error, NSHTTPURLResponse *response) {
NSString* onlineStatue = [NSString stringWithFormat:@"%@",data[@"status"]];
dispatch_async(dispatch_get_main_queue(), ^{
NSMutableDictionary * diccc = [NSMutableDictionary dictionary];
[diccc setDictionary: arrayAllImage[model.uid]];
//判断当前的状态。 以及是否上一次的状态值
if ([onlineStatue isEqualToString:@"1"] && ![onlineStatue isEqualToString:diccc[lasttime]]) {
UIImageView *lastImageView = [self.view viewWithTag:indexPath.row+200];
if (![lastImageView isEqual:cell.imageview]) {
return ;
}
if (dicc[@"3"]) {
//如果没有自己的头像
cell.imageview.image = imagehold;
}else{
cell.imageview.image =diccc[@"1"];
}
[diccc setObject:@"1" forKey:lasttime];
[arrayAllImage setObject:diccc forKey:model.uid];
cell.busyOr.hidden = YES;
}else if([onlineStatue isEqualToString:@"0"] && ![onlineStatue isEqualToString:diccc[lasttime]]){
//不在线
cell.busyOr.hidden = YES;
UIImageView *lastImageView = [self.view viewWithTag:indexPath.row+200];
if (![lastImageView isEqual:cell.imageview]) {
return ;
}
if (dicc[@"3"]) {
//如果没有自己的头像
cell.imageview.image = graimage;
}else{
cell.imageview.image=diccc[@"0"];
}
[diccc setObject:@"0" forKey:lasttime];
[arrayAllImage setObject:diccc forKey:model.uid];
}
else if([onlineStatue isEqualToString:@"2"] && ![onlineStatue isEqualToString:diccc[lasttime]] ){
//忙碌
UIImageView *lastImageView = [self.view viewWithTag:indexPath.row+200];
if (![lastImageView isEqual:cell.imageview]) {
return ;
}
if (dicc[@"3"]) {
//如果没有自己的头像
cell.imageview.image = imagehold;
}else{
cell.imageview.image = diccc[@"1"];
}
[diccc setObject:@"2" forKey:lasttime];
[arrayAllImage setObject:diccc forKey:model.uid];
cell.busyOr.hidden = NO;
}
});
}];
}
return cell;