UI高级第二课  多线程和GCD——iOS学习连载30

本文详细介绍了iOS开发的基础知识及Swift编程语言的核心特性,包括界面设计、数据管理、网络请求、性能优化等方面,旨在帮助开发者提升iOS应用开发技能。

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

1.进程的基本概念
(1)每一个进程都有一个应用程序,都有独立的内存空间,一般来说一个应用程序存在一个进程,但也有多个进程的情况
(2)同一个进程中的线程共享内存中的内存和资源
2.多线程的基本概念
(1)每一个程序都有一个主线程,程序启动时创建
(2)主线程的生命周期是和应用程序绑定的,程序结束时,主线程也就停止了
(3)多线程技术表示,一个应用程序有多个线程,使用多线程能提高CPU的使用率,防止主线程阻塞
(4)任何有可能阻塞主线程的任务不要再主线程执行(如访问网络和数据库)
3. isMainThread 方法返回执行的代码是否在主线程中执行
BOOL bool1 = [[ NSThread currentThread ] isMainThread ];
NSLog(@"bool1 is %d", bool1);
4. (1)第一种方式创建线程
 NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];
// 手动开启线程
[thread start];
(2)第二种方式创建线程
    [ NSThread detachNewThreadSelector : @selector (run) toTarget : self withObject : nil ];
(3)第三种方式创建线程
    [self performSelectorInBackground:@selector(run) withObject:nil];
(4)第四种方式:block语法启动一个线程
//NSOperationQueue是一个操作队列或者线程池
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
//往队列中添加一个操作
[queue addOperationWithBlock :^{
        [ self run ];
    }];
(5)第五种方式:NSOperation开启一个线程
 //不要去直接创建NSOperation对象
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(run) object:nil];
[queue addOperation :operation];
(6) 第六种方式:创建一个继承于NSOperation的类开启一个线程
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
PersonOperation *operation = [[PersonOperation alloc] init];
[queue addOperation :operation];
5. 设置并发数
queue.maxConcurrentOperationCount = 1;
6. 设置等级
operation. queuePriority = NSOperationQueuePriorityVeryLow ;
7. 在异步线程中,最好添加上自动释放池
@autoreleasepool {}
8.在多线程中使用定时器必须开启 RunLoop,因为只有开启 RunLoop保持线程为活动状态,才能保持定时器能不断执行
9. (1)创建定时器方法一
  // 此方法默认已经将定时器添加到当前的 runloop 中去了
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timeAction:) userInfo:nil repeats:YES];

[[ NSRunLoop currentRunLoop ] run ];
(2)创建定时器方法二
  // 此方法是创建一个定时器,但是并没有把它添加到 runloop 中去
NSTimer *timer = [NSTimer timerWithTimeInterval:1 target:self selector:@selector(timeAction:) userInfo:nil repeats:YES];
  // runloop 中添加定时器
[[ NSRunLoop currentRunLoop ] addTimer :timer forMode : NSDefaultRunLoopMode ];
 
[[NSRunLoop currentRunLoop] run];
10. 所有有关 UI 的操作必须放在主线程中执行
11.线程的生命周期存在五个状态:新建、就绪、运行、阻塞、死亡
12.GCD是一个替代诸如NSThread,NSOperationQueue,NSInvocationOperation等技术的一个高效、强大、底层的技术
13.GCD支持同步或异步任务处理,串行或并行的处理队列,非系统调用的信号量机制,定时任务处理,进程、文件或网络的监听任务等
14.GCD优点:
(1)易用:GCD比之thread更简单易用。基于block的特性导致它能极为简单地在不同代码作用域之间传递上下文
(2)效率:GCD实现功能轻量、优雅,使得它在很多地方比之专门创建消耗资源的线程更实用且快速
(3)性能:GCD自动根据系统负载来增减线程数量,这就减少了上下文切换以及增加了计算效率
(4)安全:无需加锁或其他同步机制
15.Dispatch Queue是执行处理的等待队列。通过d ispatch_async等函数,按照先进先出(FIFO)顺序追加到 Queue中处理
16.两种 Dispatch Queue:
(1)Serial  Dispatch Queue (Private Dispatch Queue )—— 等待现在正在执行的任务处理结束
  • 一个线程同时执行一个任务,可以避免数据竞争的问题
  • 可以生成多个Serial Dispatch Queue,各个Serial Dispatch Queue将并行执行   
(2)Concurrent  Dispatch Queue (Global Dispatch Queue ) —— 不等待现在正在执行的任务处理结束(并行、并发)
  • 多个线程同时执行多个任务,效率高。具体是多少个线程并发执行,取决于CPU核数和CPU负荷
17. 获取系统的主线程队列
dispatch_queue_t queue = dispatch_get_main_queue ();
18.Main Dispatch Queue是在主线程里执行的队列,即为 Serial Dispatch Queue
19. 获取系统默认创建的异步线程队列
dispatch_queue_t globleQueue = dispatch_get_global_queue ( DISPATCH_QUEUE_PRIORITY_DEFAULT , 0 );
20. Global  Dispatch Queue 是所有应用程序都能够使用的 Concurrent  Dispatch Queue
21. Global  Dispatch Queue的4个执行优先级
  • DISPATCH_QUEUE_PRIORITY_HIGH
  • DISPATCH_QUEUE_PRIORITY_DEFAULT
  • DISPATCH_QUEUE_PRIORITY_LOW
  • DISPATCH_QUEUE_PRIORITY_BACKGROUND(非常低的优先级,这个优先级只用于不太关心完成时间的真正的后台任务)
22.dispatch_async是指将指定的Block块异步的追加到指定的   Dispatch Queue中, dispatch_async函数不做任何等待
23. dispatch_sync同步追加Block块,在追加Block结束之前, dispatch_sync函数会一直等待,等待队列前面的所有任务完成后才能执行追加的任务
24.使用 dispatch_sync容易引起死锁
25.dispatch_once一次执行。保证 dispatch_once中的代码块在应用程序里面只执行一次,无论是不是多线程。所以可以用来实现单例模式,安全、简洁、方便
26. 使用 GCD 创建单例
+ ( Person *)sharePerson
{
   
static dispatch_once_t onceToken;
   
dispatch_once (&onceToken, ^{
       
ps = [[ Person alloc ] init ];
    });
   
return ps ;
}
27.dispatch_after实现延迟调用
  • 原理:并不是在指定时间后执行任务处理,而是在指定时间后把任务追加到Dispatch Queue里面,所以会有少许延迟
  • 注意我们不能(直接)取消已经提交到dispatch_after里的代码
28. dispatch_time_t->when  什么时候执行延迟调用的代码
   dispatch_queue_t -> queue 执行的任务放入到哪个队列
   dispatch_block_t -> block 具体执行的任务
29. 异步添加事件 , 所有任务的执行顺序是随机的
30.dispatch_group_async用来监视一组block对象的完成,可以同步或异步地监视
  • dispatch_group_notify所有任务执行结束汇总,不阻塞当前进程
  • dispatch_group_wait等待直到所有任务执行结束,中途不能取消,阻塞当前进程
31.   dispatch_apply(size_t iterations, dispatch_queue_t queue, <#^(size_t)block#>)
     其中:iterations: 遍历执行的次数; queue: 执行操作所在的队列; block: 执行的具体任务
32. 使用 dispatch_apply 执行效率比一般的 for 循环执行效率要高
33.Dispatch Semaphore(信号)
  • Dispatch Semaphore是持有计数的信号
  • Dispatch Semaphore使用计数来实现该信号功能
  • 等待条件: 如果信号量>0,则不需要等待直接往下执行,但信号量-1, 如果信号量为0则等待
    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
  • 发信号,使原来的信号量计数值+1
    dispatch_semaphore_signal(semaphore);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值