在对数据处理时通常会把比较耗时数据处理放到子线程中,可有效的避免主线程卡死,但多线程对同一资源的访问却很难控制。就简单说一说我遇到的问题吧。
项目中需要对一个试试显示列表进行显示,因为有部分需要进行网络请求,所以使用了线程。在子线程中加载数据,加载完成后跳回主线程刷新UI,但最后运行却发现不行,直接崩了。通过添加断点调试找到了问题所在。因为数据在请求下来以后需要遍历,加载本地数据,然后按分类添加到不同的数组,在运行过程中主线程子线程可同时对数组进行操作,造成了主线程在刷新tableView程中子线程对该数组进行了操作,结果造成了数组越界等问题。
针对这个问题我采用了多种方式,最后采用了添加变量的方式,添加一变量,仅在子线程对其进行操作,当进入主线程时将它复制给属性变量,经过这样处理后项目已经可进行正常运行了。
大体实现伪代码:
@property (nonatomic,strong)NSMutableArray *listArray; //属性
//进入子线程前先定义子线程操作数组
NSMutableArray *list = [[NSMutableArray alloc] init];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_SERIAL, NULL), ^{
//对list进行操作
dispatch_async(dispatch_get_main_queue(), ^{
//回到主线程将list赋值给listArray
_listArray = list;
[_tableView reloadData];
});
});