博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
主线程子线程同时对资源调用
阅读量:6949 次
发布时间:2019-06-27

本文共 759 字,大约阅读时间需要 2 分钟。

hot3.png

在对数据处理时通常会把比较耗时数据处理放到子线程中,可有效的避免主线程卡死,但多线程对同一资源的访问却很难控制。就简单说一说我遇到的问题吧。

项目中需要对一个试试显示列表进行显示,因为有部分需要进行网络请求,所以使用了线程。在子线程中加载数据,加载完成后跳回主线程刷新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];

    });

});

转载于:https://my.oschina.net/AngeloTsui/blog/685191

你可能感兴趣的文章
uva 10280(欧拉函数)
查看>>
面试 : C语言 功底 被 鄙视了
查看>>
MySQL优化—工欲善其事,必先利其器(2)
查看>>
java floor round ceil 使用
查看>>
实现 像网易云音乐 播放列表那样的弹出型Dialog
查看>>
play for scala 通过网易smtp发送邮件
查看>>
<转>简单之美——系统设计黄金法则
查看>>
列出对像属性,for(var i in obj)[转]
查看>>
Js(DOM) 和Jq 对象的相互转换
查看>>
HDUOJ3980取模运算
查看>>
20165318 2017-2018-2 《Java程序设计》第九周学习总结
查看>>
mysql 数据库备份的多种方式
查看>>
WebView使用技巧和介绍
查看>>
使矩形区域无效
查看>>
工具的链接
查看>>
js中的数据类型及判断方法
查看>>
Set和Map数据结构
查看>>
Katana
查看>>
HDU 1003 Max Sum * 最长递增子序列(求序列累加最大值)
查看>>
6.11 将分割数据转换为多值IN列表
查看>>