iOS学习6_多线程NSThread和GCD

NSThread

1.显式创建线程调用start开启

NSThread * thread = [[NSThread alloc]initWithTarget:self selector:@selector(run:) object:_url];
[thread start];

2.隐式创建

[NSThread detachNewThreadSelector:@selector(run:) toTarget:self withObject:_url];

3.

[self performSelectorInBackground:@selector(run:) withObject:_url];

使用NSThread类似于Java里面的Thread类,线程同步等也是使用synchronized关键字。

GCD:Grand-Central-Dispatch

苹果提供的多核并行解决方案

自动管理线程生命周期

屏蔽掉了创建线程和管理线程的底层内容,让程序员使用并发编程更容易。

两个概念:任务和队列。

任务:要执行的操作

队列:用来存放任务。

定制自己的任务,然后将任务加入到队列后,GCD会自动从队列取出任务放到对应的线程执行。

相关概念:

同步:和当前线程是一条线,不开启线程dispatch_async函数

异步:开启线程dispatch_sync函数

串行队列:让任务一个接着一个执行

并行队列:多个任务同时执行,自动开启线程,只有在异步的情况下才有效。一般使用全局并发队列

队列决定任务怎么执行不决定是否开启线程;同步/异步决定是否开启线程。

创建串行队列:

dispatch_queue_attr_t attr;
dispatch_queue_t queue = dispatch_queue_create("qhyuan",attr);

获取全局并发队列:

diapstch_queue_tqueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

最常使用:

1. 异步函数 + 并行队列

diapstch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{// exec task});
dispatch_async(queue, ^{// exec task});
dispatch_async(queue, ^{// exec task});

一般会开启三个线程,并且同时执行。

2.异步函数 + 串行队列

dispatch_queue_attr_t attr;
dispatch_queue_t queue = dispatch_queue_create("qhyuan", attr);
dispatch_async(queue, ^{// exec task});
dispatch_async(queue, ^{// exec task});
dispatch_async(queue, ^{// exec task});

开启一个线程,并且串行的执行。可以打印出线程id发现是一样的。

3.一个特殊的串行队列:主队列

它是一个与主线程相关的队列,自带的一个串行队列。放在主队列中的任务,不论他是同步还是异步都会在主线程中执行,注意,主队列和同步函数使用时,由于是串行的会等到当前任务执行完才会继续往下执行,所以当他后面还有代码为执行就会出问题。因此一般使用异步函数和主队列搭配使用。

特殊之处就在于只有使用的是主队列,那么任务一定在主线程里面执行。

dispatch_async(dispatch_get_main_queue(), ^{
    // change UI
});

GCD的其他使用:

1.队列组:

使用函数

dispatch_group_async(dispatch_group_t group, dispatch_queue_t queue, ^(void){ })

dispatch_group_t 参数就是一个队列组,可以如下创建一个队列组,dispatch_queue_t指定了block里面的任务在那里执行。

dispatch_group_t group = dispatch_group_create();

使用队列组的好处是,他会等到扔进队列组的所有任务执行完成后执行下面方法:

dispatch_group_notify(dispatch_group_t group, dispatch_queue_t queue, ^(void)block);

2.延迟执行

[NSThread sleepForTimeInterval:];//会卡主线程
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)), queue, ^{
    // delayInSeconds秒后执行的内容
});

3.一次性代码:

static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    // 这里的代码只会执行一次
});

线程之间的通信:在主线程修改UI

[self performSelectorOnMainThread:(SEL) withObject:(id) waitUntilDone:(BOOL)]

使用GCD方案:

dispatch_async(dispatch_get_main_queue(), ^{
    //这里的代码是在主线程执行的
});

发送http请求时使用主队列,当然这里的主队列和GCD里面获取主队列不一样。

[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
}];

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-10 14:55:51

iOS学习6_多线程NSThread和GCD的相关文章

IOS学习笔记 -- 多线程

多线程1.多线程的原理 1>.同一时间,CPU只能处理1条线程,只有1条线程在工作(执行) 2>.多线程并发(同时)执行,其实是CPU快速地在多条线程之间调度(切换) 3>.如果CPU调度线程的时间足够快,就造成了多线程并发执行的假象如果线程非常非常多,会发生: 1>.CPU会在N多线程之间调度,CPU会累死,消耗大量的CPU资源 2>.每条线程被调度执行的频次会降低(线程的执行效率降低) 2.多线程的优缺点 1>.多线程的优点 能适当提高程序的执行效率 能适当提高资源

多线程——NSThread、GCD、NSOperation

1.前言: 一个应用程序就是一个进程,一个进程至少包含一个线程,程序启动会自动创建一个主线程,负责UI界面的现实和控件事件的监控.多线程可以更充分的利用系统CPU资源,一定程度上提升程序的性能.1个进程可以开启多条线程,每条线程可以并行(同时)执行不同的任务.在一个线程内可以包含多个事物(要干的活),在线程内依据先进先出的特性串行执行…… 2.NSThread - (void)viewDidLoad { [super viewDidLoad]; NSLog(@"main thread is %@

【iOS沉思录】NSThread、GCD、NSOperation多线程编程总结

OC中的多线程 OC中多线程根据封装程度可以分为三个层次:NSThread.GCD和NSOperation,另外由于OC兼容C语言,因此仍然可以使用C语言的POSIX接口来实现多线程,只需引入相应的头文件:#include <pthread.h>. NSThread NSThread是封装程度最小最轻量级的,使用更灵活,但要手动管理线程的生命周期.线程同步和线程加锁等,开销较大: NSThread的基本使用比较简单,可以动态创建初始化NSThread对象,对其进行设置然后启动:也可以通过NST

转载的一篇关于iOS里多线程NSThread/NSOperation/GCD的文章

转载 IOS多线程编程对于初学者来说,总是会觉得很难理解和掌握,现在通过几个实例来更加系统全面的理解IOS多线程编程,希望对大家有所帮助. 1:首先简单介绍什么叫线程可并发执行的,拥有最小系统资源,共享进程资源的基本调度单位.共用堆,自有栈(官方资料说明iOS主线程栈大小为1M,其它线程为512K).并发执行进度不可控,对非原子操作易造成状态不一致,加锁控制又有死锁的风险. 2:IOS中的线程iOS主线程(UI线程),我们的大部分业务逻辑代码运行于主线程中.没有特殊需求,不应引入线程增加程序复杂

iOS学习之多线程

iOS有三种多线程编程的技术,分别是: 1. NSThread (iOS多线程编程之NSThread的使用) 2. Cocoa NSOperation (iOS多线程编程之NSOperation和NSOperationQueue的使用) 3. GCD 全称:Grand Central Dispatch( iOS多线程编程之Grand Central Dispatch(GCD)介绍和使用) 这三种编程方式从上到下,抽象度层次是从低到高的,抽象度越高的使用越简单,也是Apple最推荐使用的.

iOS学习笔记(8)——GCD初探

1. AppDelegate.m 1 #import "AppDelegate.h" 2 #import "ViewController.h" 3 @interface AppDelegate () 4 5 @end 6 7 @implementation AppDelegate 8 9 10 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDicti

学习IOS开发网络多线程篇--NSThread/GCD/

NSThread:利用NSThread创建和启用一个线程 1. NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];,调用后调用[thread start]; 2. 创建线程后自动启动线程 ,[NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil]; 3. 隐式创建

iOS多线程 NSThread/GCD/NSOperationQueue

http://www.cnblogs.com/kenshincui/p/3983982.html iOS开发系列--并行开发其实很容易 2014-09-20 23:34 by KenshinCui, 9738 阅读, 19 评论, 收藏,  编辑 --多线程开发 概览 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的,一个复杂的多步操作只能一步步按顺序逐个执行.改变这种

iOS开发之多线程技术(NSThread、OperationQueue、GCD)

在前面的博客中如果用到了异步请求的话,也是用到的第三方的东西,没有正儿八经的用过iOS中多线程的东西.其实多线程的东西还是蛮重要的,如果对于之前学过操作系统的小伙伴来说,理解多线程的东西还是比较容易的,今天就做一个小的demo来详细的了解一下iOS中的多线程的东西.可能下面的东西会比较枯燥,但还是比较实用的. 多线程用的还是比较多的,废话少说了,下面的两张截图是今天我们实验的最终结果,应该是比较全的,小伙伴们由图来分析具体的功能吧: 功能说明: 1.点击同步请求图片,观察整个UI界面的变化,并点