多线程的主要是用来执行一些耗时操作,例如网络图片、视频、歌曲、书籍等资源下载,游戏中的音乐播放等,充分发挥多核处理器的优势,并发(同时执行)任务让系统运行的更快、更流畅。

介绍下比较常用的多线程技术, 主要有NSObject、NSThread、NSOperation、GCD等。

1、 NSObject多线程技术

1> 使用performSelectorInBackground可以开启后台线程,执行selector选择器选择的方法

2> 使用performSelectorOnMainThread可以重新回到主线程执行任务,通常用于后台线程更新界面UI时使用

3> [NSThread sleepForTimeInterval:1.0f];  让当前线程休眠,通常在程序开发中,用于模拟耗时操作,以便跟踪不同的并发执行情况!

 但是,在程序发布时,千万不要保留此方法!不要把测试中的代码交给客户,否则会造成不好的用户体验。

 提示:使用performSelectorInBackground也可以直接修改UI,但是强烈不建议使用。修改UI最好在主线程中执行

 注意:在使用NSThread或者NSObject的线程方法时,一定要使用自动释放池,否则容易出现内存泄露。

 - (void)viewDidLoad
{
[super viewDidLoad]; // 在后台线程执行方法
[self performSelectorInBackground:@selector(testObject) withObject:nil]; // 打印当前线程num
NSLog(@"main - %@", [NSThread currentThread]);
} - (void)testObject
{
// 自动释放池,避免出现内存泄露
@autoreleasepool { // 让当前线程睡眠 2.0 秒
[NSThread sleepForTimeInterval:2.0f]; // 打印当前线程
NSLog(@"Background - %@", [NSThread currentThread]);
}
}

2、NSThread多线程技术

1> 类方法直接开启后台线程,并执行选择器方法

detachNewThreadSelector

2> 成员方法,在实例化线程对象之后,需要使用start执行选择器方法

initWithTarget

对于NSThread的简单使用,可以用NSObject的performSelectorInBackground替代

同时,在NSThread调用的方法中,同样要使用autoreleasepool进行内存管理,否则容易出现内存泄露。

 - (void)viewDidLoad
{
[super viewDidLoad]; // 开启新线程执行方法
[NSThread detachNewThreadSelector:@selector(testObject) toTarget:self withObject:nil]; // // 通过实例化一个线程来开启任务
// NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(testObject) object:nil];
//
// [thread start]; // 打印当前线程num
NSLog(@"main - %@", [NSThread currentThread]);
} - (void)testObject
{
// 自动释放池,避免出现内存泄露
@autoreleasepool { // 让当前线程睡眠 2.0 秒
[NSThread sleepForTimeInterval:2.0f]; // 打印当前线程
NSLog(@"Background - %@", [NSThread currentThread]);
}
}

3、NSOperation多线程技术

1> 使用步骤:

1) 实例化操作

a) NSInvocationOperation

b) NSBlockOperation

2) 将操作添加到队列NSOperationQueue即可启动多线程执行

2> 更新UI使用主线程队列

[NSOpeationQueue mainQueue] addOperation ^{};

3> 操作队列的setMaxConcurrentOperationCount

可以设置同时并发的线程数量!

提示:此功能仅有NSOperation有!

4> 使用addDependency可以设置任务的执行先后顺序,同时可以跨操作队列指定依赖关系

提示:在指定依赖关系时,注意不要循环依赖,否则不工作。

 @interface FLViewController ()
{
NSOperationQueue *_queue;
}
@end @implementation FLViewController - (void)viewDidLoad
{
[super viewDidLoad]; // 1. 初始化操作队列
_queue = [[NSOperationQueue alloc] init]; // 2. 创建线程操作
// NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(testObject) object:nil]; NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{ // 让当前线程睡眠 2.0 秒
[NSThread sleepForTimeInterval:2.0f]; // 打印当前线程
NSLog(@"Background - %@", [NSThread currentThread]);
}];
// 3. 开启线程
[_queue addOperation:op];
}

4、GCD多线程技术-Grand Central Dispatch

GCD是基于C语言的框架,该多线程技术是苹果官方推荐使用的。

1> 要使用GCD,所有的方法都是dispatch开头的

2> 名词解释

global  全局

queue   队列

async   异步

sync    同步

3> 要执行异步的任务,就在全局队列中执行即可

dispatch_async 异步执行控制不住先后顺序

4> 关于GCD的队列

全局队列    dispatch_get_global_queue

参数:优先级 DISPATCH_QUEUE_PRIORITY_DEFAULT

始终是 0

串行队列    dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL);

是创建得到的,不能直接获取

主队列      dispatch_get_main_queue

5> 异步和同步与方法名无关,与运行所在的队列有关!

提示:要熟悉队列于同步、异步的运行节奏,一定需要自己编写代码测试!

规律:并发队列(global/concurrent),根据函数名判断是同步执行(dispatch_sync)还是异步执行(dispatch_async)

    串行队列(serial),无论后面的函数名是同步还是异步,均按照同步执行,并且,如果队列中第一个函数为同步,则该队列中所有的函数均在当前线程(一般为主线程)执行

/*! dispatch_async(sync)只负责将任务添加至操作队列,并不关心任务什么时候执行
* sync: 同步添加,也就说第一个任务A添加完成之后,要等它执行完成,才会添加任务B,然后执行任务B,再添加任务C,执行任务C……
* async: 异步添加,任务A添加完成以后,马上添加任务B,然后添加任务C,无论任务是否执行
* concurrent: 添加至该队列的任务都是并发的,也就是说,添加进来立刻分配线程执行
* serial: 添加至该队列的任务都是顺序执行的,也就是说,在一个线程上按添加顺序执行任务
*/

同步主要用来控制方法被调用的顺序

 - (void)viewDidLoad
{
[super viewDidLoad]; // 创建一个全局队列,优先级为默认
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, ); dispatch_async(queue, ^{ // 添加异步任务1-block
NSLog(@"-----1- %@", [NSThread currentThread]);
}); dispatch_async(queue, ^{ // 添加异步任务2-block
NSLog(@"-----2- %@", [NSThread currentThread]);
}); dispatch_async(queue, ^{ // 添加异步任务3-block
NSLog(@"-----3- %@", [NSThread currentThread]);
});
}

ios开发之多线程的更多相关文章

  1. iOS开发之多线程技术

    本篇争取一篇讲清讲透,依然将通过四大方面清晰的对iOS开发中多线程的用法进行详尽的讲解: 一.什么是多线程 1)多线程执行原理 2)线程与进程 3)多线程的优缺点 二.我们为什么要用多线程编程技术 三 ...

  2. iOS开发-多线程开发之线程安全篇

    前言:一块资源可能会被多个线程共享,也就是多个线程可能会访问同一块资源,比如多个线程访问同一个对象.同一个变量.同一个文件和同一个方法等.因此当多个线程访问同一块资源时,很容易会发生数据错误及数据不安 ...

  3. iOS开发-多线程编程技术(Thread、Cocoa operations、GCD)

    简介 在软件开发中,多线程编程技术被广泛应用,相信多线程任务对我们来说已经不再陌生了.有了多线程技术,我们可以同做多个事情,而不是一个一个任务地进行.比如:前端和后台作交互.大任务(需要耗费一定的时间 ...

  4. ios开发之多线程---GCD

    一:基本概念 1:进程:正在运行的程序为进程. 2:线程:每个进程要想执行任务必须得有线程,进程中任务的执行都是在线程中. 3:线程的串行:一条线程里任务的执行都是串行的,假如有一个进程开辟了一条线程 ...

  5. iOS开发之多线程(NSThread、NSOperation、GCD)

    整理一些多线程相关的知识. 并行 & 并发 1.并行:并行是相对于多核而言的,几个任务同时执行.2.并发:并发是相对于单核而言的,几个任务之间快速切换运行,看起来像是"同时" ...

  6. iOS开发中多线程基础

    耗时操作演练 代码演练 编写耗时方法 - (void)longOperation { for (int i = 0; i < 10000; ++i) { NSLog(@"%@ %d&q ...

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

    在前面的博客中如果用到了异步请求的话,也是用到的第三方的东西,没有正儿八经的用过iOS中多线程的东西.其实多线程的东西还是蛮重要的,如果对于之前学过操作系统的小伙伴来说,理解多线程的东西还是比较容易的 ...

  8. iOS开发之多线程技术——NSOperation篇

    本篇将从四个方面对iOS开发中使用到的NSOperation技术进行讲解: 一.什么是NSOperation 二.我们为什么使用NSOperation 三.在实际开发中如何使用NSOperation ...

  9. iOS开发之多线程技术——GCD篇

    本篇将从四个方面对iOS开发中GCD的使用进行详尽的讲解: 一.什么是GCD 二.我们为什么要用GCD技术 三.在实际开发中如何使用GCD更好的实现我们的需求 一.Synchronous & ...

  10. iOS开发之多线程技术—GCD篇

    本篇将从四个方面对iOS开发中GCD的使用进行详尽的讲解: 一.什么是GCD 二.我们为什么要用GCD技术 三.在实际开发中如何使用GCD更好的实现我们的需求 一.Synchronous & ...

随机推荐

  1. 【leetcode】15. 3Sum

    题目描述: Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find ...

  2. Java中的哈希

    Java中的哈希 前言 在开发中经常用到HashMap.HashSet等与哈希有关的数据结构,一直只知道这些哈希的数据结构不保证顺序,不清楚具体什么情况.所以在这里大致总结一下.   Java的Has ...

  3. AutoEventWireup="false"

    在 Web 服务器控件中,某些事件(通常是 Click 事件)会导致窗体被回发到服务器.HTML 服务器控件和 Web 服务器控件(如 TextBox 控件)中的更改事件将被捕获,但不会立即导致发送. ...

  4. Linux C 程序 进程间通信(20)

    进程间通信 1.进程间通信的几种手段:    (1).管道        数据只能由一个进程流向另一个进程(其中一个读管道,一个写管道),如果要建立全双工通信,需要建立两个管道        只能用于 ...

  5. [jQuery]我的封装笔记

    jQuery封装插件开发入门教程: http://www.awaimai.com/467.html 一.默认值和选项 jQuery.extend函数解释 extend(dest,src1,src2,s ...

  6. easyUI中treegrid组件构造树形表格(简单数据类型)+ssm后台

    这几天做的项目要求用树形表格的形式展示一部分数据,于是就想到了使用easyUI的treegrid组件,但几经翻查各种资料,发现数据类型大多采取标准数据类型,即包含children元素的数据类型,小编查 ...

  7. C#使用SocketAsyncEventArgs操作套接字的简单异步通讯

    SocketAsyncEventArgs是一个套接字操作的类,主要作用是实现socket消息的异步接收和发送,跟Socket的BeginSend和 BeginReceive方法异步处理没有多大区别,它 ...

  8. UE4 将本地图片转成UTexture2D 在runtime显示

    UFUNCTION(BlueprintCallable, Category = "TextureFromDisk") static class UTexture2D* GetTex ...

  9. Git客户端TortoiseGit(Windows系统)的使用方法

    本文环境: 操作系统:Windows XP SP3 Git客户端:TortoiseGit-1.8.8.0-32bit 一.安装Git客户端 全部安装均采用默认! 1. 安装支撑软件 msysgit: ...

  10. vmware虚拟机上网:host-only

    host-only配置 首先主机:vmware1要能共享本地连接这个网络,共享后vmware的ip会自动设置为如图 其次,vmware网络设置如图 最后,虚拟机设置如图 这样,主机与虚拟机之间就能pi ...