主线程子线程同时对资源调用

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值