侧边栏壁纸
博主头像
落叶人生博主等级

走进秋风,寻找秋天的落叶

  • 累计撰写 130555 篇文章
  • 累计创建 28 个标签
  • 累计收到 9 条评论
标签搜索

目 录CONTENT

文章目录

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

2024-05-09 星期四 / 0 评论 / 0 点赞 / 6 阅读 / 2099 字

在对数据处理时通常会把比较耗时数据处理放到子线程中,可有效的避免主线程卡死,但多线程对同一资源的访问却很难控制。就简单说一说我遇到的问题吧。 项目中需要对一个试试显示列表进行显示,因为有部分需要进行网

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

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

    });

});

广告 广告

评论区