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

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

[[NSRunLoopcurrentRunLoop]run];
(2)创建定时器方法二
 //此方法是创建一个定时器,但是并没有把它添加到runloop中去
NSTimer *timer = [NSTimertimerWithTimeInterval:1target:selfselector:@selector(timeAction:)userInfo:nilrepeats:YES];
 //runloop中添加定时器
[[NSRunLoopcurrentRunLoop]addTimer:timerforMode:NSDefaultRunLoopMode];
 
[[NSRunLoopcurrentRunLoop] 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 (PrivateDispatch Queue)—— 等待现在正在执行的任务处理结束
  • 一个线程同时执行一个任务,可以避免数据竞争的问题
  • 可以生成多个SerialDispatch Queue,各个SerialDispatch Queue将并行执行   
(2)Concurrent Dispatch Queue (GlobalDispatch Queue) —— 不等待现在正在执行的任务处理结束(并行、并发)
  • 多个线程同时执行多个任务,效率高。具体是多少个线程并发执行,取决于CPU核数和CPU负荷
17.获取系统的主线程队列
dispatch_queue_tqueue = dispatch_get_main_queue();
18.MainDispatch Queue是在主线程里执行的队列,即为SerialDispatch Queue
19.获取系统默认创建的异步线程队列
dispatch_queue_tglobleQueue = 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 = [[Personalloc]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);
0 0