iOS tableViewCell 在cell赋值、网络加载照片位置偏移大小错乱,做一个类似qq列表的tableview 更新3
更新3: 问题 加载慢!
(一时间给的处理负载过大,要分散)在下载图片,判断状态后 对每个cell对图片灰置图片处理保存,影响了主线程的操作
:上拉加载时,无法上下滑动tableview 无法点击cell
: 去除对每一个图片对灰置保存,只保存彩色,在需要灰色时在灰置,
需求: 类似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,
,// bits per component
,
colorSpace,
kCGBitmapByteOrderDefault);
CGColorSpaceRelease(colorSpace);
if(context ==NULL) {
return nil;
}
CGContextDrawImage(context,
CGRectMake(,, width, height), source.CGImage);
UIImage*grayImage = [UIImage imageWithCGImage:CGBitmapContextCreateImage(context)];
CGContextRelease(context);
return grayImage;
}
//下载图片
//根据uid 取出相应的字典
NSMutableDictionary * dicc = arrayAllImage[model.uid];
//判断是否保存过图片
if (dicc[@""]) {
//之前保存过值
cell.imageview.image = dicc[@""]; if ([dicc[lasttime] isEqualToString:@""]) {
cell.busyOr.hidden = NO; }else{
cell.busyOr.hidden = YES; } }else{ //没有的话 下载 保存,设置在线状态 0离线灰色头像 1在线2忙碌彩色头像
if ([model.status isEqualToString:@""]) {
[cell.imageview sd_setImageWithURL:[NSURL URLWithString:model.headimage] placeholderImage:[UIImage imageNamed:HeadPortraitDoctor]]; dicc =[NSMutableDictionary dictionary]; [dicc setObject:cell.imageview.image forKey:@""]; [dicc setObject:@"" forKey:lasttime];
[arrayAllImage setObject:dicc forKey:model.uid]; cell.busyOr.hidden = YES;//隐藏 忙碌状态
}
else if([model.status isEqualToString:@""]){ [cell.imageview sd_setImageWithURL:[NSURL URLWithString:model.headimage] placeholderImage:nil];
//不在线
cell.busyOr.hidden = YES; dicc =[NSMutableDictionary dictionary];
if (cell.imageview.image) { cell.imageview.image = [UIImage createGrayCopy:cell.imageview.image];
}else{ cell.imageview.image = graimage;
[dicc setObject:graimage forKey:@""];
} [dicc setObject:cell.imageview.image forKey:@""];
[dicc setObject:@"" forKey:lasttime];
[arrayAllImage setObject:dicc forKey:model.uid]; }
else if([model.status isEqualToString:@""]){
//忙碌
[cell.imageview sd_setImageWithURL:[NSURL URLWithString:model.headimage] placeholderImage:[UIImage imageNamed:HeadPortraitDoctor]]; dicc =[NSMutableDictionary dictionary];
[dicc setObject:cell.imageview.image forKey:@""];
[dicc setObject:@"" forKey:lasttime];
[arrayAllImage setObject:dicc forKey:model.uid];
cell.busyOr.hidden = NO;
} } if(!ScrollerYesNo){
//给图片标记
cell.imageview.tag = indexPath.row+; [[GetUrlSession shareUrlconnection]connetion:[NSString stringWithFormat:@"%@?uid=%@&port=%@",searchOnlineStatusGet,model.uid,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:@""] && ![onlineStatue isEqualToString:diccc[lasttime]]) { UIImageView *lastImageView = [self.view viewWithTag:indexPath.row+]; if (![lastImageView isEqual:cell.imageview]) { return ;
} //在线
[cell.imageview sd_setImageWithURL:[NSURL URLWithString:model.headimage] placeholderImage:[UIImage imageNamed:HeadPortraitDoctor]]; [dicc setObject:cell.imageview.image forKey:@""]; [dicc setObject:@"" forKey:lasttime];
[arrayAllImage setObject:dicc forKey:model.uid]; cell.busyOr.hidden = YES;
}else if([onlineStatue isEqualToString:@""] && ![onlineStatue isEqualToString:diccc[lasttime]]){
//不在线
cell.busyOr.hidden = YES; UIImageView *lastImageView = [self.view viewWithTag:indexPath.row+]; if (![lastImageView isEqual:cell.imageview]) { return ;
} [cell.imageview sd_setImageWithURL:[NSURL URLWithString:model.headimage] placeholderImage:nil];
if (cell.imageView.image) {
cell.imageview.image = [UIImage createGrayCopy:cell.imageview.image];
}else{
cell.imageview.image = graimage;
}
[dicc setObject:cell.imageview.image forKey:@""];
[dicc setObject:@"" forKey:lasttime];
[arrayAllImage setObject:dicc forKey:model.uid]; }
else if([onlineStatue isEqualToString:@""] && ![onlineStatue isEqualToString:diccc[lasttime]] ){
//忙碌 UIImageView *lastImageView = [self.view viewWithTag:indexPath.row+]; if (![lastImageView isEqual:cell.imageview]) { return ;
} //在线
[cell.imageview sd_setImageWithURL:[NSURL URLWithString:model.headimage] placeholderImage:[UIImage imageNamed:HeadPortraitDoctor]];
[dicc setObject:cell.imageview.image forKey:@""];
[dicc setObject:@"" forKey:lasttime];
[arrayAllImage setObject:dicc forKey:model.uid];
cell.busyOr.hidden = NO;
} }); }]; }
iOS tableViewCell 在cell赋值、网络加载照片位置偏移大小错乱,做一个类似qq列表的tableview 更新3的更多相关文章
- IOS空数据页面,网络加载失败以及重新登陆View的封装(不需要继承)
一.问题 对于B2C和B2B项目的开发者,可能会有一个订单列表为空,或者其他收藏页面为空,用户token失效,判断用户要重新登陆,以及后台服务错误等提示.本篇课文,看完大约10分钟. 原本自己不想写空 ...
- [置顶] iOS学习笔记47——图片异步加载之EGOImageLoading
上次在<iOS学习笔记46——图片异步加载之SDWebImage>中介绍过一个开源的图片异步加载库,今天来介绍另外一个功能类似的EGOImageLoading,看名字知道,之前的一篇学习笔 ...
- SwiftUI - 一步一步教你使用UIViewRepresentable封装网络加载视图(UIActivityIndicatorView)
概述 网络加载视图,在一个联网的APP上可以讲得上是必须要的组件,在SwiftUI中它并没有提供如 UIKit 中的UIActivityIndicatorView直接提供给我们调用,但是我们可以通过 ...
- iOS网络加载图片缓存与SDWebImage
加载网络图片可以说是网络应用中必备的.如果单纯的去下载图片,而不去做多线程.缓存等技术去优化,加载图片时的效果与用户体验就会很差. 一.自己实现加载图片的方法 tips: *iOS中所有网络访问都是异 ...
- iOS网络加载图片缓存策略之ASIDownloadCache缓存优化
iOS网络加载图片缓存策略之ASIDownloadCache缓存优化 在我们实际工程中,很多情况需要从网络上加载图片,然后将图片在imageview中显示出来,但每次都要从网络上请求,会严重影响用 ...
- iOS最笨的办法实现无限轮播图(网络加载)
iOS最笨的办法实现无限轮播图(网络加载) 简单的做了一下: 使用方法: 把 请求返回的 图片地址(字符串类型)放进数组中就行 可以使用SDWebImage(我就是用的这个)等..需要自己导入并引用, ...
- iOS简单音乐实现、React-Native完整项目、仿闲鱼京东列表分页、语音识别、网络加载过度动画等源码
iOS精选源码 iOS快速入手语音识别.听写.评测.播报 网络加载数据的过渡动画(仿简书网页) iOS 封装跑马灯和轮播效果 crash防护组件,适用常见常用的数组,字典等crash保护 iOS:高仿 ...
- ios -网络加载json和本地加载json
1网络加载json的时候,要在模型的实现文件里写: - (void)setValue:(id)value forKey:(NSString *)key { } 2本地加载json的时候,要在模型的实现 ...
- android快捷开发之Retrofit网络加载框架的简单使用
大家都知道,安卓最大的特点就是开源化,这自然会产生很多十分好用的第三方API,而基本每一个APP都会与网络操作和缓存处理机制打交道,当然,你可以自己通过HttpUrlConnection再通过返回数据 ...
随机推荐
- Struts2-052验证脚本
下面分享一下Struts2-052验证的python脚本 #-*- coding:utf-8 -*- import requests url_list_path ="/home/d0ll4r ...
- let和const命令
let命令 1.let用来声明变量,类似于var,但只在代码块内有效. { let a = 1; var b = 2; } console.log(a); //a is not defined con ...
- 问题(一)---线程池,锁、堆栈和Hashmap相关
一.线程池: 多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力. 假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2 在线程中 ...
- LDA算法入门
http://blog.csdn.net/warmyellow/article/details/5454943 LDA算法入门 一. LDA算法概述: 线性判别式分析(Linear Discrimin ...
- 关于Excel数据批量导入数据库的案例
写这个案例主要是感觉这个功能挺实用,很多地方会用得到的,废话就不多说了,直接上对应的源码. 这个案例我运用的是Winform窗体程序实现数据的导入. 首先是数据库的登陆界面如下: 源码如下: usin ...
- java并发包下的并发工具类
1.Exchanger 功能:用于线程间数据的交换 应用场景:1)遗传算法,目前还不是特别理解 2)校对工作,假设A,B线程做同一件任务,可以通过数据校验判断两线程是否正确的工作 例子:是一个简单的 ...
- javaScript基础概念小知识点集
数据类型 typeof是一个操作符而不是函数,因此例子中圆括号尽管可以使用,但不是必须的. 只要在保存对象的变量还没有真正保存对象,就应该明确的让该变量保存null NaN是一个特殊的数值,与任何值都 ...
- Asp.net Core中SignalR Core预览版的一些新特性前瞻,附源码(消息订阅与发送二进制数据)
目录 SignalR系列目录(注意,是ASP.NET的目录.不是Core的) 前言 一晃一个月又过去了,上个月有个比较大的项目要验收上线.所以忙的脚不沾地.现在终于可以忙里偷闲,写一篇关于Signal ...
- 非一屏页面,出现遮罩层页面位置不动,并且遮罩层一屏显示。(pc,移动端都适用的方法)
首先展示页面效果: 遮罩没出现的页面张酱紫:页面在楼层二这个位置. 遮罩显示:后面页面页面任停留在当前浏览位置,滚动条并未回顶部 下面来说说写法: css: 页面具体布局样式......(此处省略无数 ...
- ThreadLocal终极源码剖析
目录一.ThreadLocal1.1 源码注释1.2 源码剖析 散列算法-魔数0x61c88647 set操作 get操作 remove操作1.3 功能测试1.4 应用 ...