多线程&NSObject&NSThread&NSOperation&GCD

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]);
});
时间: 2024-10-27 11:33:09

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

iOS多线程开发--NSThread NSOperation GCD

多线程 当用户播放音频.下载资源.进行图像处理时往往希望做这些事情的时候其他操作不会被中 断或者希望这些操作过程中更加顺畅.在单线程中一个线程只能做一件事情,一件事情处理不完另一件事就不能开始,这样势必影响用户体验.早在单核处理器时期 就有多线程,这个时候多线程更多的用于解决线程阻塞造成的用户等待(通常是操作完UI后用户不再干涉,其他线程在等待队列中,CPU一旦空闲就继续执行, 不影响用户其他UI操作),其处理能力并没有明显的变化.如今无论是移动操作系统还是PC.服务器都是多核处理器,于是“并行

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

1.iOS的三种多线程技术 1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 2.以下两点是苹果专门开发的"并发"技术,使得程序员可以不再去关心线程的具体使用问题 NSOperation/NSOperationQueue 面向对象的线程技术 GCD -- Grand Central Dispatch(派发) 是基于C语言的框架,可以充分利用多核,是苹果推荐使用的多线程技术. 以上这三种编程方式从上到下,抽象度层次是从低到高的,抽象度越高的使用越简单,

iOS并发编程对比总结,NSThread,NSOperation,GCD - iOS

1. 多线程概念 进程 正在进行中的程序被称为进程,负责程序运行的内存分配 每一个进程都有自己独立的虚拟内存空间 线程 线程是进程中一个独立的执行路径(控制单元) 一个进程中至少包含一条线程,即主线程 可以将耗时的执行路径(如:网络请求)放在其他线程中执行 创建线程的目的就是为了开启一条新的执行路径,运行指定的代码,与主线程中的代码实现同时运行 1.1 多任务系统调度示意图 说明:每个应用程序由操作系统分配的短暂的时间片(Timeslice)轮流使用CPU,由于CPU对每个时间片的处理速度非常快

多线程之pthread, NSThread, NSOperation, GCD

关于多线程会有一系列如下:多线程之概念解析 多线程之pthread, NSThread, NSOperation, GCD 多线程之NSThread 多线程之NSOperation 多线程之GCD pthread:跨平台,适用于多种操作系统,可移植性强,是一套纯C语言的通用API,且线程的生命周期需要程序员自己管理,使用难度较大,所以在实际开发中通常不使用. NThread:是苹果对pthread的一个封装.通过封装可以在Cocoa环境中,可以更简易地用多线程.线程的生命周期由程序员管理.每个N

iOS多线程入门之NSThread,NSOperation,GCD

一 线程的概念 一个运行着的程序就是一个进程或者叫做一个任务,一个进程至少包含一个线程,线程就是程序的执行流.Mac和iOS中的程序启动,创建好一个进程的同时, 一个线程便开始运行,这个线程叫主线程.主线程在程序中的地位和其他线程不同,它是其他线程最终的父线程,且所有界面的显示操作即AppKit或 UIKit的操作必须在主线程进行. 系统中的每一个进程都有自己独立的虚拟内存空间,而同一个进程中的多个线程则共用进程的内存空间.每创建一个新的线程,都需要一些内存(如每个线程有自己的Stack空间)和

ios多线程(NSThread、GCD、NSOperation)

ios中得多线程技术主要使用3种:NSThread.NSOperation和GCD 一.NSThread: 最轻量级方法,但是不安全需要手动加锁,需要自己管理生命周期 NSThread的使用方法有2种: // 第一种,需要start 1 NSThread *th1 = [[NSThread alloc] initWithTarget:self selector:@selector(btnClick) object:nil]; 2     [th1 setName:@"线程1"]; 3 

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

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

iOS多线程管理-Thread,NSOperation,GCD的简单用法

多线程 1.程序是一个可执行文件 2.进程是程序执行的一个操作实体 3.进程是线程的集合 4.多线程就是在一个程序(一个进程)中开启多条线路,为并发执行多个任务提供方便. 什么是线程? 1.进程当中并发执行的代码片段 2.线程是提高代码效率的一个手段 3.IOS中主要用于防止界面假死 4.线程是处理异步任务的主要手段 =============================== NSThread 1.+ (void)detachNewThreadSelector:(SEL)selector t

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

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