在iOS开发线程操作时,一般方法名决定是否开启新线程(async,sync),队列类型(全局队列,串行队列)决定开启多少条线程

1.快速线程调用

*开启后台线程执行任务

[self performSelectorInBackground:@selector(test) withObject:nil];

*回到主线程执行任务

[self performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:YES];

2.GCD : 依赖队列执行

1> 队列类型

* 全局队列

* 所有添加到全局队列中的任务都是并发执行(同时执行,可能会开启多个线程)

* dispatch_get_global_queue

* 串行队列

* 所有添加到串行队列中的任务都是按顺序执行(开一条线程)

* dispatch_queue_create("myqueue", 0);

* 主队列

* 所有添加到主队列中的任务都是在主线程中执行的(跟方法名没有关系)

* dispatch_get_main_queue

2> 同步还是异步,取决于方法名(不影响主队列,影响全局队列、串行队列)

* 同步:dispatch_sync,在当前线程执行任务,不会开启新的线程

* 异步:dispatch_async,在其他线程执行任务,会开启新的线程

3.NSOperation\NSOperationQueue

1> 使用步骤

* 创建NSOperation

* 添加NSOperation到NSOperationQueue

2> 优点

* 更加面向对象

* 可以控制最大并发数  maxConcurrentOperationCount

* 添加任务(Operation)之间的依赖 addDependency

*/

#import "XMQViewController.h"

@interface XMQViewController ()

{

NSOperationQueue *_queue;

}

@end

@implementation XMQViewController

- (void)viewDidLoad

{

[super viewDidLoad];

_queue = [[NSOperationQueue alloc] init];

// 控制最大并发数,最多同时执行3条线程

_queue.maxConcurrentOperationCount = 3;

// 回到主线程

//    [self test];

// 线程监听

//    [self gcd_group];

// GCD线程依赖

//    [self gcd_barrier];

// 循环执行

[self gcd_apply];

// 全局队列

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

// 串行队列

//    dispatch_queue_t queue2 = dispatch_queue_create("myqueue", 0);

dispatch_async(queue, ^{ // 耗时操作

NSLog(@"这是一个异步线程---%@", [NSThread currentThread]);

});

}

- (IBAction)click

{

NSOperation *operation = [NSBlockOperation blockOperationWithBlock:^{

NSLog(@"operation---%@", [NSThread currentThread]);

}];

NSOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{

NSLog(@"operation2---%@", [NSThread currentThread]);

}];

// 该方法默认在主线程执行

//    [operation start];

// 加入队列会在异步线程执行

[_queue addOperation:operation];

[_queue addOperation:operation2];

// 设置线程依赖 (operation2依赖于operation,operation执行完以后,才能执行operation2)

[operation addDependency:operation2];

}

// 延时执行某条线程

- (IBAction)click2

{

// 全局队列

//    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

// 串行队列

dispatch_queue_t queue2 = dispatch_queue_create("myqueue", 0);

double delayInSeconds = 5.0;

dispatch_time_t delayInNanoSeconds =dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);

dispatch_after(delayInNanoSeconds, queue2, ^{

NSLog(@"延迟执行");

});

}

// dispatch_group_async(异步方法)可以实现监听一组任务是否完成,完成后得到通知执行其他的操作(比如通知用户下载完成,显示UI等)

- (void)gcd_group

{

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");

});

}

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

- (void)gcd_barrier

{

dispatch_queue_t queue = dispatch_queue_create("myqueue", 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:2];

NSLog(@"dispatch_async3");

});

}

// dispatch_apply 执行某个代码片段N次

- (void)gcd_apply

{

dispatch_queue_t queue = dispatch_queue_create("myqueue", DISPATCH_QUEUE_PRIORITY_DEFAULT);

dispatch_apply(10, queue, ^(size_t index) {

NSLog(@"循环执行10次");

});

}

// 回到主线程

- (void)test

{

UIImage *image = nil;

[self performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:YES];

dispatch_async(dispatch_get_main_queue(), ^{

NSLog(@"更新UI界面---%@", [NSThread currentThread]);

});

}

@end

iOS线程开发小结的更多相关文章

  1. iOS 库 开发小结

    1.基本用法 定义类,导出头文件,注意头文件,库文件的search path 2.加载资源 - 使用主工程的文件,耦合性太强 - 封装到NSBundle中 NSBundle可以封装xib storyb ...

  2. iOS多线程开发

    概览 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的,一个复杂的多步操 ...

  3. iOS企业级开发初级课程-表视图(13集)

    首先了解了表视图的组成.表视图类的构成.表视图的分类以及表视图的两个重要协议(委托协议和数据源协议),对表视图有了一个整体上的认识.接下来我们掌握了如何实现简单表视图和分节表视图,以及表视图中索引.搜 ...

  4. ios 多线程开发(一)简介

    简介 线程是在一个程序中并发的执行代码的方法之一.虽然有一些新的技术(operations, GCD)提供了更先进高效的并发实现,OS X和iOS同时也提供了创建和维护线程的接口. 这里将要介绍线程相 ...

  5. IOS高级开发之多线程(四)NSOperation

    1.什么是NSOperation,NSOperationQueue? NSOperation是一个抽象的基类,表示一个独立的计算单元,可以为子类提供有用且线程安全的建立状态,优先级,依赖和取消等操作. ...

  6. vue开发小结(下)

    前言 继前几天总结了vue开发小结(上)后,发现还有很多的点没有能列举出来,于是还是打算新建一个下篇,再补充一些vue开发中需要注意的细节,确实还是都是细节的问题,我只是在这里强调下,希望对大家有帮助 ...

  7. web前端开发与iOS终端开发的异同[转]

    * {-webkit-tap-highlight-color: rgba(0,0,0,0);}html {-webkit-text-size-adjust: none;}body {font-fami ...

  8. iOS应用开发最佳实践

    <iOS应用开发最佳实践> 基本信息 作者: 王浩    出版社:电子工业出版社 ISBN:9787121207679 上架时间:2013-7-22 出版日期:2013 年8月 开本:16 ...

  9. pdfjs viewer 开发小结

    此文已由作者吴家联授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 1. pdfjs库简介 PDF.js 是由Mozilla 主导推出的可以将PDF文件转换为H5页面进行展示的 ...

随机推荐

  1. Css的优先权问题

    看这篇文章之前,对这个问题一直没深入研究,导致有时候遇到一些问题会很麻烦,看到这篇文章让我茅塞顿开,转帖回来保存一下以便今后复习. 发现很多朋友对 CSS 的优先权不甚了解,规则很简单.需要说明的一点 ...

  2. SMON进程、PMON进程、LGWR/ARCH

    SMON 进程:system monitor instance monitor 系统监控.实例监控进程 说明及作用:在实例关闭时,会清理临时段,整理空闲空间free space; 实例非正常关闭后,启 ...

  3. ZOJ 3432 Find the Lost Sock (异或的运用)

    Alice bought a lot of pairs of socks yesterday. But when she went home, she found that she has lost ...

  4. 20155204 2016-2017-2 《Java程序设计》第7周学习总结

    20155204 2016-2017-2 <Java程序设计>第7周学习总结 教材学习内容总结 在只有Lambda表达式的情况下,参数的类型必须写出来,如果有目标类型的话,在编译程序可推断 ...

  5. BZOJ3551: [ONTAK2010]Peaks加强版【Kruskal重构树】【主席树】

    重要的事情说三遍 不保证图联通 不保证图联通 不保证图联通 那些和我一样认为重构树是点数的童鞋是要GG Description [题目描述]同3545 Input 第一行三个数N,M,Q. 第二行N个 ...

  6. 最短路--spfa+队列优化模板

    spfa普通版就不写了,优化还是要的昂,spfa是可以判负环,接受负权边和重边的,判断负环只需要另开一个数组记录每个结点的入队次数,当有任意一个结点入队大于点数就表明有负环存在 #include< ...

  7. Mysql隔离级别 sql示例理解

    前言 事务要解决的是多线程并发修改数据库的问题.Mysql innodb 引擎支持事务.类似 Java 中的各种锁,例如乐观锁(CAS),读写锁,悲观锁.事务也有很多级别. 每个隔离级别要解决的问题都 ...

  8. LeetCode Single Number I II Python

    Single Number Given an array of integers, every element appears twice except for one. Find that sing ...

  9. xsl -fo 了解

    XSL-FO是用于格式化XML数据的语言,全称为Extensible Stylesheet Language Formatting Objects(格式化对象的可扩展样式表语言),是W3C参考标准,现 ...

  10. Oracle删除归档文件

    归档文件过大,会导致数据库出现异常,无法登陆. 1.D盘下新建一个delete_arch.txt文件 connect target / run { DELETE ARCHIVELOG ALL COMP ...