iOS开发-iOS多线程开发中踩过的坑-GCD的特性-NSOperation线程依赖-iOS多线程踩坑小结

本文详细介绍了iOS多线程开发中的常见问题,包括如何从其他线程回到主线程,GCD的dispatch_group_create和同步调度可能导致的死锁,NSOperation线程依赖的实例,以及GCD的计时器和延时执行。同时,探讨了在项目中选择GCD还是NSOperation的策略,并解析了线程死锁和线程安全的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本期内容:

  • iOS开发中从其他线程回到主线程的方法
  • dispatch_group_create 组的概念
  • dispatch_sync同步调度主线程会死锁的原因
  • 项目中什么时候选择GCD什么时候选择NSOperation
  • NSOperation 线程依赖的简单例子
  • GCD的计时器和延时执行
  • 简单说说线程死锁和线程安全⭐️

iOS开发中从其他线程回到主线程的方法

在开发中我们经常使用简单的多线程,用来让数据和视图更好分配来提高项目的性能。一般在调用其他线程和自己创建的线程完成数据的加载以及处理之后,我们需要回到主线程来更新我们的UI视图,该怎么做呢?其实很简单,以下三种方式都可以回到主线程来执行任务:

- (void)backToMainThread{
   
    // 方法1,可以直接使用NSThread
    [self performSelectorOnMainThread:@selector(dosomething:) withObject:nil waitUntilDone:NO];
    [self performSelectorOnMainThread:@selector(dosomething:) withObject:nil waitUntilDone:NO modes:nil];
    
    // 方法2,在使用GCD的时候,可以直接在线程中使用
    dispatch_async(dispatch_get_main_queue(), ^{
   
        // 使用异步线程获取主线程,如果在同步线程获取主线程,会阻塞线程
        // 关于为什么会阻塞线程,下面会仔细讲解
        [self dosomething:nil];
    });
    
    // 方法3,使用NSOperationQueue
    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
   
        // NSOperationQueue有类方法,直接获取就可以使用了
        [self dosomething:nil];
    }];
}

- (void)dosomething:(id)sender{
   
    NSLog(@"dosomething");
}

dispatch_group_create 组的概念

dispatch_group_create 有一个组的概念,可以把相关的任务归并到一个组内来执行
dispatch_group_async把异步任务提交到指定任务组和指定下拿出队列执行
参数有:
dispatch_group_enter
dispatch_group_leave
dispatch_group_wait
前两个要成对使用,wait会阻塞线程,等enter和leave执行完才会结束阻塞
dispatch_group_notify 待任务组执行完毕时调用,不会阻塞当前线程

因为下划线在MACDOWN语言中是斜体所以使用代码块来表述,以下来看看Group的使用:

- (void)downLoadImage{
   
    // 创建全局队列
    dispatch_queue_t imageDownLoadQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    // 把全局队列添加到异步线程里面
    dispatch_async(imageDownLoadQueue, ^{
   
        // 使用分组执行下载人物
        // 创建一个组
        dispatch_group_t imageGroup =dispatch_group_create();
        
        // 添加接收图片的数据对象
        //__block UIImage *image1 = nil;
        //__block UIImage *image2 = nil;
        //__block UIImage *image3 = nil;
        //__block UIImage *image4 = nil;
        
        // 在组里面创建异步任务
        dispatch_group_async(imageGroup, dispatch_get_global_queue<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值