1、NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 
以下两点是苹果专门开发的“并发”技术,使得程序员可以不再去关心线程的具体使用问题 
2、NSOperation/NSOperationQueue 面向对象的线程技术 
3、GCD —— Grand Central Dispatch(派发) 是基于C语言的框架,可以充分利用多核,是苹果推荐使用的多线程技术

以上这三种编程方式从上到下,抽象度层次是从低到高的,抽象度越高的使用越简单,也是Apple最推荐使用的。但是就目前而言,iOS的开发者,需要了解三种多线程技术的基本使用过程。因为很多框架技术分别使用了不同多线程技术。

NSThread: 
优点:NSThread 比其他两个轻量级,使用简单 
缺点:需要自己管理线程的生命周期、线程同步、加锁、睡眠以及唤醒等。线程同步对数据的加锁会有一定的系统开销 
NSOperation: 
不需要关心线程管理,数据同步的事情,可以把精力放在自己需要执行的操作上 
NSOperation是面向对象的 
GCD: 
Grand Central Dispatch是由苹果开发的一个多核编程的解决方案。iOS4.0+才能使用,是替代NSThread, NSOperation的高效和强大的技术 
GCD是基于C语言的

NSObject的多线程方法——后台线程

  • (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg 
    通常,由于线程管理相对比较繁琐,而很多耗时的任务又无法知道其准确的完成时间,因此可以使用performSelectorInBackground方法直接新建一个后台线程,并将选择器指定的任务在后台线程执行,而无需关心具体的NSThread对象
    提示: 
    performSelectorInBackground方法本身是在主线程中执行的,而选择器指定的方法是在后台线程中进行的 
    使用performSelectorInBackground方法调用的任务可以更新UI界面 
    在大型交互式游戏中

  • (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait; 
    如果要更新UI界面,可以在后台线程中调用performSelectorOnMainThread方法 
    提示:尽管使用performSelectorInBackground方法调用的任务可以更新UI界面,但是在实际开发中,涉及到UI界面的更新操作,还是要使用performSelectorOnMainThread方法,以避免不必要的麻烦

    - (IBAction)bigTask


    // 本方法中的所有代码都是在主线程中执行的 
    // NSObject多线程技术 
    NSLog(@“执行前->%@“, [NSThread currentThread]);

    // performSelectorInBackground是将bigDemo的任务放在后台线程中执行 
    [self performSelectorInBackground:@selector(bigDemo) withObject:nil];

    NSLog(@“执行后->%@“, [NSThread currentThread]); 
    // [self bigDemo];

    NSLog(@“执行完毕”); 
    }

NSThread创建线程方法:

  • (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(id)argument;

  • (id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument; 
    参数说明: 
    selector:线程执行的方法,只能有一个参数,不能有返回值 
    target:selector消息发送的对象 
    argument:传输给target的唯一参数,也可以是nil

    // 成员方法 
    NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(bigDemo) object:nil];

    // 启动start线程 
    [thread start];

NSOperation & NSOperationQueue 
NSOperation的两个子类 
NSInvocationOperation 
NSBlockOperation 
工作原理: 
用NSOperation封装要执行的操作 
将创建好的NSOperation对象放NSOperationQueue中 
启动OperationQueue开始新的线程执行队列中的操作 
注意事项: 
使用多线程时通常需要控制线程的并发数,因为线程会消耗系统资源,同时运行的线程过多,系统会变慢 
使用以下方法可以控制并发的线程数量: 
(void)setMaxConcurrentOperationCount:(NSInteger)cnt;

<!-- lang: cpp -->
NSInvocationOperation *op1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(opAction) object:nil]; // 如果使用start,会在当前线程启动操作

// [op1 start];

<!-- lang: cpp -->
[_queue addOperation:op1]; <!-- lang: cpp -->
// 用block的最大好处,可以将一组相关的操作,顺序写在一起,便于调试以及代码编写
[_queue addOperationWithBlock:^{
NSLog(@"%@", [NSThread currentThread]); // 模拟延时
[NSThread sleepForTimeInterval:1.0f]; // 模拟获取到图像
UIImage *image = [UIImage imageNamed:@"头像1"]; // 设置图像,在主线程队列中设置
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
_imageView.image = image;
}];
}];

GCD是基于C语言的框架 
工作原理: 
让程序平行排队的特定任务,根据可用的处理资源,安排它们在任何可用的处理器上执行任务 
要执行的任务可以是一个函数或者一个block 
底层是通过线程实现的,不过程序员可以不必关注实现的细节 
GCD中的FIFO队列称为dispatch queue,可以保证先进来的任务先得到执行 
dispatch_notify 可以实现监听一组任务是否完成,完成后得到通知 
GCD队列: 
全局队列:所有添加到主队列中的任务都是并发执行的 
串行队列:所有添加到串行队列中的任务都是顺序执行的 
主队列:所有添加到主队列中的任务都是在主线程中执行的

全局队列(可能会开启多条线程) 
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
串行队列(只可能会开启一条线程) 
dispatch_queue_t queue = dispatch_queue_create(“myQueue”, DISPATCH_QUEUE_SERIAL); 
主队列 
dispatch_get_main_queue();

异步操作 
dispatch_async 在其他线程执行任务,会开启新的线程 
异步方法无法确定任务的执行顺序 
同步操作 
dispatch_sync 在当前在当前线程执行任务,不开启新的线程 
同步操作与队列无关 
同步方法会依次执行,能够决定任务的执行顺序 
更新界面UI时,最好使用同步方法

GCD的优点: 
充分利用多核 
所有的多线程代码集中在一起,便于维护 
GCD中无需使用@autoreleasepool 
如果要顺序执行,可以使用dispatch_sync同步方法 
dispatch_async无法确定任务的执行顺序

<!-- lang: cpp -->
// 1. 队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); // 2. 将任务异步(并发)执行
dispatch_async(queue, ^{
NSLog(@"a->%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"b->%@", [NSThread currentThread]);
}); dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"main - > %@", [NSThread currentThread]);
});

多线程&NSObject&NSThread&NSOperation&GCD的更多相关文章

  1. iOS的三种多线程技术NSThread/NSOperation/GCD

    1.iOS的三种多线程技术 1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 2.以下两点是苹果专门开发的"并发"技术,使得程序员可以不再去关心 ...

  2. iOS多线程开发--NSThread NSOperation GCD

    多线程 当用户播放音频.下载资源.进行图像处理时往往希望做这些事情的时候其他操作不会被中 断或者希望这些操作过程中更加顺畅.在单线程中一个线程只能做一件事情,一件事情处理不完另一件事就不能开始,这样势 ...

  3. 多线程技术 NSThread & NSOperation & GCD

    多线程:在iOS开发中,用到多线程的处理问题的时候有很多,比如异步下载数据时刷新界面等等. 引入多线程来处理问题的关键就是,基于多线程可以使界面更加流畅,防止界面假死. 界面假死:比如你单击一个按钮来 ...

  4. 多线程之pthread, NSThread, NSOperation, GCD

    关于多线程会有一系列如下:多线程之概念解析 多线程之pthread, NSThread, NSOperation, GCD 多线程之NSThread 多线程之NSOperation 多线程之GCD p ...

  5. NSThread/NSOperation/GCD 三种多线程技术

    1.iOS的三种多线程技术 1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 2.以下两点是苹果专门开发的“并发”技术,使得程序员可以不再去关心线程的具体使用问题 ...

  6. iOS 多线程 简单学习NSThread NSOperation GCD

    1:首先简单介绍什么叫线程 可并发执行的,拥有最小系统资源,共享进程资源的基本调度单位. 共用堆,自有栈(官方资料说明iOS主线程栈大小为1M,其它线程为512K). 并发执行进度不可控,对非原子操作 ...

  7. iOS 多线程(NSThread、GCD、NSOperation)

    ios中得多线程技术主要使用3种:NSThread.NSOperation和GCD 一.NSThread: 最轻量级方法,但是不安全需要手动加锁,需要自己管理生命周期 NSThread的使用方法有2种 ...

  8. iOS之多线程开发NSThread、NSOperation、GCD

    原文出处: 容芳志的博客   欢迎分享原创到伯乐头条 简介iOS有三种多线程编程的技术,分别是:(一)NSThread(二)Cocoa NSOperation(三)GCD(全称:Grand Centr ...

  9. 九、使用多线程——NSThread,GCD和NSOperation

    概述 早上起床,你先打开洗衣机,然后用热水把泡面泡上,接着打开电脑开启一天的码农生活.其中“洗衣服”.“泡泡面”和“码代码”3个任务(线程)同时进行,这就是多线程.网上有许多关于多线程的经典解释,此处 ...

随机推荐

  1. Tomcat上的项目部署到WebLogic上の注意事项

    1.修改web.xml: <!-- <display-name>weboutweb</display-name> --> <!-- 注释掉 display-n ...

  2. 四则运算GUI版本功能展现

    对于四则运算的GUI版本实现支持批量出题,由于我的不积极导致教师没找到对应的连接,现在重新补上链接 http://www.cnblogs.com/liquan/p/5978687.html codin ...

  3. [php] 使用IDE的正则搜索代码

    ([^a-zA-Z_=$0-9/\[\>])('|"|,)?(\s*)store_banner(\s*)('|"|,)?([^a-zA-Z_=$0-9\/\(\]:]) 用在 ...

  4. 原生js获取execl里面的值 主要使用ActiveXObject

    今天一个程序员给了一个excel表,里面有一百多条数据,叫我一个一个数据的复制到系相应的函数里面比如 put("gaga1","gaga2"),这样一句话,要我 ...

  5. PHPCMS V9 环境搭建

    PHPCMS V9的学习总结分为以下几点: [1]PHPCMS 简介 PHP原始为Personal Home Page的缩写,(外文名:PHP: Hypertext Preprocessor,中文名: ...

  6. Linux kernel的 Makefile和Kconfig以及Make menuconfig的关系【转】

    本文转载自:http://blog.sina.com.cn/s/blog_4ba5b45e0102e6vp.html 熟悉内核的Makefile对开发设备驱动.理解内核代码结构都是非常重要的linux ...

  7. simpleBLEPeripheral.c 文件分析

    这个配置或者说任务, 让这个蓝牙设备成为了一个简单的BLE外设. 这里定义了外设的广播数据, 以及最重要, char被改变之后的回调, 引出后来的coreHandler里面的, ack 以及写e2pr ...

  8. 模块已加载,但对dllregisterServer的调用失败

    在注册dll或者ocx的时候, 经常会遇到这么一个问题: 模块  已加载,但对dllregisterServer的调用失败,错误代码为0x8004***** 网上有网友回复说需要在管理员的模式下进行注 ...

  9. js 如何生成唯一且不可预测的 ID

    通常数据库可以生成唯一的 ID,最多的就是数字序列,也有像 MongoDB 这样产生组合序列的,不过这种形式的 ID 由于是序列,是可以预测的.如果想得到不可预测且唯一的 ID,方法还是有的. 下面主 ...

  10. Install MongoDB on Red Hat Enterprise, CentOS, Fedora, or Amazon Linux

    Install MongoDB on Red Hat Enterprise, CentOS, Fedora, or Amazon Linux¶ Overview Use this tutorial t ...