iOS多线程开发总结

pThead:

pThread是一套很多操作系统上都用到的API, 所以移植性特别强, 同样适用于iOS, 但是使用的比较少.

使用:

首先在需要使用pthread的文件中导入头文件

#import <pthread.h>

创建:


第一个参数: pthread指针

第二个参数: 设置为NULL

第三个参数: 一个函数指针, 相当于selector

第四个参数: 设置为NULL

NSThread:

NSThread经过苹果公司封装后的, 完全面向对象的, 可以直接对线程对象进行操作.

创建: 三种方式

1.

NSThread *thread = [[NSThread alloc]initWith Target:self selector:@selector(runThread) object:nil];

[threadstart];

2. 

[NSThread detachNewThreadSelector:@selector(runThread)to Target:self withObject:nil];

3.

[self performSelectorInBackground:@selector(runThread) withObject:self];

注: 

有些时候如售票, 发单等情况(需要计算数量) 要使用线程锁, 开启NSThread锁有两种方式

1.

@synchronized(self) {

<#statements#>

}

2.

@property (nonatomic,strong) NSCondition *condition;

[self.condition lock];  //锁

[self.condition unlock]; //解锁


GCD:

GCD是苹果为了多核的并行运算提出的一套解决方案, 它可以合理地更多地利用CPU内核,最重要的是它可以自动管理线程的生命周期,比如创建线程, 任务调度, 销毁线程,我们只需要告诉GCD要做的事情就可以了,它也是基于C语言的,不过里边引入了block(OC).

划分:

同步&异步 (以当前线程会不会被阻塞划分)

同步在任务执行时会阻塞当前线程,在任务执行完毕后才会执行其他任务. 而异步则不会

串行&并行 (队列相关的, 对有依赖关系的任务非常重要)

常用:

dispatch_get_main_queue : 主线程的队列, 回到主线程, 执行刷新UI等操作

dispatch_get_global_queue : 全局的并行队列


第一个参数可以设置线程在并行队列中的优先级, 共有以下几种, 优先级由高到低为: HIGH > DEFAULT > LOW

在并行队列中这种设置优先级的方式只可以影响到线程先后的执行顺序, 并不能决定线程是否可以先执行完毕.


创建方式:

创建并行队列:

dispatch_async(dispatch_get_global_queue(0,0), ^{

   //耗时操作

   [NSThread sleepForTimeInterval:3];

   dispatch_async(dispatch_get_main_queue(), ^{

      //刷新UI

   });

});

dispatch_queue_t  queue =dispatch_queue_create("test",DISPATCH_QUEUE_CONCURRENT);

创建串行队列:

dispatch_queue_t  queue =dispatch_queue_create("test",DISPATCH_QUEUE_SERIAL); //第二个参数也可以传NULL

dispatch_group_t:

使用场景:在多个任务异步处理之后, 需要一个统一的回调通知告诉我们所有的任务都结束了, 然后根据需求处理其他任务, 回调通知如下:

dispatch_queue_t queue =dispatch_queue_create("test",DISPATCH_QUEUE_CONCURRENT);

dispatch_group_t group =dispatch_group_create();

dispatch_group_async(group, queue, ^{

NSLog(@"test 1");

[NSThread sleepForTimeInterval:2];

NSLog(@"test 1 end");

});

dispatch_group_async(group, queue, ^{

NSLog(@"test 2");

[NSThread sleepForTimeInterval:2];

NSLog(@"test 2 end");

});

dispatch_group_async(group, queue, ^{

NSLog(@"test 3");

[NSThread sleepForTimeInterval:2];

NSLog(@"test 3 end");

});

dispatch_group_notify(group, queue, ^{

NSLog(@"tasks over");

});

dispatch_group_t group =dispatch_group_create();

dispatch_group_async(group, queue, ^{

NSLog(@"test 1");

[NSThread sleepForTimeInterval:2];

NSLog(@"test 1 end");

});

控制台打印结果:



注:

当我们要在dispatch_group_async中执行的耗时操作(比如网络请求回调)执行的应该是同步操作,不应该是异步操作, 如果要进行异步操作,可以按如下步骤做:

dispatch_group_enter(group);

[self sendRequest:^{

NSLog(@"1");

dispatch_group_leave(group);

}];

enter要与leave成对出现!

GCD其他:

dispatch_once的使用:

单例:


只执行一次的操作:

如某个按钮只允许点击一次等.

dispatch_after:

延迟执行:

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2*NSEC_PER_SEC)),dispatch_get_main_queue(), ^{

//延迟操作

});

NSOperation:

NSOperation实际上是对GCD的一种封装,它的实例封装了需要执行的操作以及执行操作所需要的数据,并且能够以并发或者非并发执行操作, NSOperation是一个抽象类, 我们需要使用它的子类, 有两种使用方式:

1.NSInvocationOperation & NSBlockOperation

2.自定义类集成NSOperation

相关概念:

1. NSOperationQueue(线程池)

    a.  addOperation

    b.  setMaxConcurrentOperationCount

2. 状态

ready(执行之前, 只有当状态为ready时才能进行操作), cancelled(取消,当执行任务时可以进行取消的, 如果任务正在执行,取消无效,直到任务执行完毕), executing(正在执行), finished(执行结束), asynchronous(是否是并发).

3. 依赖-addDependency

依赖关系不能相互依赖或者循环依赖, 否则会造成死锁.


NSInvocationOperation, NSBlockOperation 通常与 NSOperationQueue一起使用以达到线程异步

例:

@property(nonatomic,strong) NSOperationQueue *queue;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容