iOS有三种多线程编程

1.、NSThread

2、CocoaNSOperation

3、GCD 全称:Grand Central Dispatch

这三种编程方式从上到下,抽象度层次是从低到高的,抽象度越高的使用越简单,也是Apple最推荐使用的。

主线程和子线程的主要区别是:主线程处理和UI相关的操作 子线程通过[obj performSelectorOnMainThread]回到主线程

 

NSOperation和GCD两者直接有什么区别呢?

GCD是底层的C语言构成的API,而NSOperationQueue及相关对象是Objc的对象。在GCD中,在队列中执行的是由block构成的任务,这是一个轻量级的数据结构;而Operation作为一个对象,为我们提供了更多的选择;

在NSOperationQueue中,我们可以随时取消已经设定要准备执行的任务(当然,已经开始的任务就无法阻止了),而GCD没法停止已经加入queue的block(其实是有的,但需要许多复杂的代码);

NSOperation能够方便地设置依赖关系,我们可以让一个Operation依赖于另一个Operation,这样的话尽管两个Operation处于同一个并行队列中,但前者会直到后者执行完毕后再执行;

我们能将KVO应用在NSOperation中,可以监听一个Operation是否完成或取消,这样子能比GCD更加有效地掌控我们执行的后台任务;

在NSOperation中,我们能够设置NSOperation的priority优先级,能够使同一个并行队列中的任务区分先后地执行,而在GCD中,我们只能区分不同任务队列的优先级,如果要区分block任务的优先级,也需要大量的复杂代码;

我们能够对NSOperation进行继承,在这之上添加成员变量与成员方法,提高整个代码的复用度,这比简单地将block任务排入执行队列更有自由度,能够在其之上添加更多自定制的功能。

 

 

dispatch queue分为下面三种:

Serial(连续的 系列的)

又称为private dispatch queues,同时只执行一个任务。Serial queue通常用于同步访问特定的资源或数据。当你创建多个Serial queue时,虽然它们各自是同步执行的,但Serial queue与Serial queue之间是并发执行的。

Concurrent (同时发生的)

又称为global dispatch queue,可以并发地执行多个任务,但是执行完成的顺序是随机的。

Main dispatch queue

它是全局可用的 在应用程序主线程上执行任务的。

 

1、常用的方法dispatch_async

为了避免界面在处理耗时的操作时卡死,比如读取网络数据,IO,数据库读写等,我们会在另外一个线程中处理这些操作,然后通知主线程更新界面。

用GCD实现这个流程的操作比前面介绍的NSThread NSOperation的方法都要简单。代码框架结构如下:

 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{

        // 耗时的操作

      dispatch_async(dispatch_get_main_queue(), ^{

            // 更新界面

        });

    });

  /*

     *系统给每一个应用程序提供了三个concurrent dispatch queues。

     *这三个并发调度队列是全局的,它们只有优先级的不同。

     *因为是全局的,我们不需要去创建。我们只需要通过使用函数dispath_get_global_queue去得到队列

     */



2、dispatch_group_async的使用

dispatch_group_async可以实现监听一组任务是否完成,完成后得到通知执行其他的操作。这个方法很有用,比如你执行三个下载任务,当三个任务都下载完成后你才通知界面说完成的了。下面是一段例子代码:

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0); 

dispatch_group_t group =dispatch_group_create(); 

dispatch_group_async(group, queue,^{ 

   [NSThread sleepForTimeInterval:1]; 

   NSLog(@"group1"); 

}); 

dispatch_group_async(group, queue, ^{ 

   [NSThread sleepForTimeInterval:2]; 

   NSLog(@"group2"); 

}); 

dispatch_group_async(group, queue,^{ 

   [NSThread sleepForTimeInterval:3]; 

   NSLog(@"group3"); 

}); 

dispatch_group_notify(group,dispatch_get_main_queue(), ^{ 

    NSLog(@"updateUi"); 

});  



3、dispatch_barrier_async的使用

dispatch_barrier_async是在前面的任务执行结束后它才执行,而且它后面的任务等它执行完成之后才会执行

例子代码如下:

dispatch_queue_t queue =dispatch_queue_create("gcdtest.rongfzh.yc",DISPATCH_QUEUE_CONCURRENT); 

dispatch_async(queue, ^{ 

   [NSThread sleepForTimeInterval:2]; 

    NSLog(@"dispatch_async1"); 

}); 

dispatch_async(queue, ^{ 

   [NSThread sleepForTimeInterval:4]; 

    NSLog(@"dispatch_async2"); 

}); 

dispatch_barrier_async(queue, ^{ 

   NSLog(@"dispatch_barrier_async"); 

   [NSThread sleepForTimeInterval:4]; 

 

}); 

dispatch_async(queue, ^{ 

   [NSThread sleepForTimeInterval:1]; 

    NSLog(@"dispatch_async3"); 

}); 



4、dispatch_apply

执行某个代码片段N次。

dispatch_apply(N, globalQ, ^(size_tindex) {

 

});


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值