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

深入理解iOS开发与Swift编程
本文详细介绍了iOS开发的基础知识及Swift编程语言的核心特性,包括界面设计、数据管理、网络请求、性能优化等方面,旨在帮助开发者提升iOS应用开发技能。
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是执行处理的等待队列。通过dispatch_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、付费专栏及课程。

余额充值