iOS开发之初试多线程

多线程的意义:通过提高系统资源的利用率,充分发挥多核处理器的优势,并发(同时执行)执行任务让系统运行的更快、更流畅

NSThread(目前已经不常用)

在NSThread多线程中最常用的是NSObject封装的多线程方法

-(void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg

这个方法可以调用继承自对象中实现的方法通过将其抛入到其他后台线程执行

(SEL即为需要调用的selector; arg为向selector中传递的参数)

这个方法可以修改程序的UI但是强烈不建议使用该方法直接修改界面.

如果需要在该方法中修改UI可以调用控件的

-(void)performSelectorOnMainThread:(SEL)aSelector     withObject:(id)arg waitUntilDone:(BOOL)wait;

方法来进行修改

performSelectorOnMainThread方法也是在nsobject类中封装的多线程方法,该方法的作用是调用对象中的方法在主线程中执行

当然也可以使用自定义线程的方式来实现多线程:

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

NSThread的工厂方法,快速返回一个NSThread对象,该方法生成的线程会直接启动

-(id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument;

NSthread的构造函数生成一个NSThread对象,该方法生成的线程对象需要手动调用start方法才能启动

需要注意的是在NSThread方式实现多线程的时候需要给每一个线程定义一个autoreleasepool,否则会出现内存泄露

NSOperation/NSOperationQueue

这是一种面向对象的多线程技术, 因其对另外两种进行了封装,所以相比较其他两种有更加全面的功能;

一般步骤:

  1. 创建一个NSOperation
  2. 创建或者获取一个NSOperationQueue
  3. 将操作添加到队列中

NSOperation分为两个子类

  1. NSInvocationOperation

- (id)initWithTarget:(id)target selector:(SEL)sel object:(id)arg;

这个方法有些类似于NSThread 主要就是需要把抛出的操作封装到target的一个对象方法中,可以传一个参数;

  1. NSBlockOperation(个人感觉最好用的)

+ (id)blockOperationWithBlock:(void (^)(void))block;

工厂方法快速生成一个blockOperation,该方法的好处就是不需要再定义一个方法,而block作为一个参数传递进去可以极大地增强代码的扩展性,降低代码间的耦合度,方便后期维护.

创建好了nsoperation之后就需要将它添加到指定的队列中去了当操作被加入到队列中的时候就立刻处于激活状态开始执行了;

NSOperation的start方法可以将该操作加入到当前的操作队列中.

另外,值得一提的是NSOperation方式实现多线程相比较其他两种最大的好处就是可以限制并发的线程数

-(void) maxConcurrentOperationCount;

这个方法是NSOperationQueue的对象方法,用来限制当前操作队列同时并发的线程数

在一个程序中,每多开一个线程就会多占用一些系统资源,在iOS环境下主线程的栈内存是1M之后每开一个子线程会占用系统512k的栈内存,所以在实际的开发中控制并发的线程数是非常重要的.

NSOperation对象之间的依赖关系:

在多线程开发中,如果几个操作之间有依赖关系是非常令人头疼的一件事,但是NSOperation可以很简单的处理不同线程之间的操作依赖关系例如,有三个操作分别为op1, op2, op3.三个操作需要按照顺序执行代码如下:

[op2 addDependency:op1];

[op3 addDependency:op2];

这种依赖关系并不受所在的操作队列限制也就是说,即使op1,op2处于子线程而且是非常耗时的操作,op3处于主线程.op3也会等到op2执行完毕后才会执行,这样在实际的开发中是非常方便的,因为在开发中操作队列中的操作并不是按照添加顺序来执行的,而添加依赖就保证了它们能够按照规定的顺序执行

Gcd

GCD 是一套基于C语言的框架,发布于iOS4.0,其设计的初衷就是为了更好的发挥多核处理器的优势,底层是通过线程实现的,GCD是苹果官方推荐使用的多线程技术;

首先介绍一下GCD的三种队列:

  1. 全局队列:所有添加到该队列的任务都是并发执行的;
  2. 串行队列:所有添加到串行队列的任务都是顺序执行的;
  3. 主队列:添加到主队列中的任务都是在主线程执行的;

各队列的获取方法:

全局队列:

dispatch_queue_t  queue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0)

参数说明:第一个参数是该队列的优先级,建议使用默认,若无特殊要求最好不要随意设置优先级

第二个参数是预留参数,需要填0

串行队列:

dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL);

参数说明:这是一个创建队列的方法,第一个参数是队列名这个可以自己随意,第二个参数有两个值DISPATCH_QUEUE_SERIAL表示创建一个串行队列

DISPATCH_QUEUE_CONCURRENT表示创建一个并行队列(感觉意义不大因为已经有了全局队列)

主队列: dispatch_queue_t queue =dispatch_get_main_queue();

以上就是三种队列的获取方法

下面开始介绍GCD中任务执行方法

GCD任务执行分为同步方法和异步方法,其实实际是同步还是异步需要方法名和执行队列共同来决定的,这就需要读者自己多去练习才能完全理解

首先是异步方法

dispatch_async(dispatch_queue_t queue, dispatch_block_t block);

参数:第一个参数为执行队列第二个参数是任务的代码块

同步方法:

dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);

参数与异步方法传入参数一样

这里由于有两种执行方法,四种队列组合方式实在是太多,我也就不一一列举了,如果想要了解GCD其实最直接的方法就是,分别给两种方法传入不同的队列,然后按照各种顺序调用,只有多练习才能完全掌握;

其实GCD在实际使用中是非常简单的

只需要两步而已:

第一步获取一个执行队列,第二步将操作同步或者异步的加入到执行队列中去

注:示例代码我在找一个比较稳定的网盘,所以会稍后上传

时间: 2024-10-02 18:55:59

iOS开发之初试多线程的相关文章

iOS开发网络篇—多线程断点下载

iOS开发网络篇—多线程断点下载 说明:本文介绍多线程断点下载.项目中使用了苹果自带的类,实现了同时开启多条线程下载一个较大的文件.因为实现过程较为复杂,所以下面贴出完整的代码. 实现思路:下载开始,创建一个和要下载的文件大小相同的文件(如果要下载的文件为100M,那么就在沙盒中创建一个100M的文件,然后计算每一段的下载量,开启多条线程下载各段的数据,分别写入对应的文件部分). 项目中用到的主要类如下: 完成的实现代码如下: 主控制器中的代码: 1 #import "YYViewControl

iOS开发之网络多线程

iOS开发之网络多线程 1. pthred (POSIX) 一般情况不用 2. NSThread NSThread *thread1 = [[NSThread alloc] initWithTarget:self selector:@selector(dealThreadExit:) object:nil]; [thread1 start]; [NSThread detachNewThreadSelector:@selector(detailTextLabel) toTarget:self wi

iOS开发--四种多线程技术方案

iOS 多线程的四种技术方案 image pthread 实现多线程操作 代码实现: void * run(void *param) { for (NSInteger i = 0; i < 1000; i++) { NSLog(@"---buttonclick---%zd---%@", i, [NSThread currentThread]); } return NULL; } @implementation ViewController - (IBAction)clickBut

在iOS开发为什么使用多线程 ,多线程有哪些方法

多线程是一个比较轻量级的方法来实现单个应用程序内多个代码执行路径 在系统级别内,程序并排执行,程序分配到每个程序的执行时间是基于该程序的所需时间和其他程序的所需时间来决定的. 然而,在每个程序内部,存在一个或者多个执行线程,它同时或在一个几乎同时发生的方式里执行不同的任务. 概要提示: iPhone中的线程应用并不是无节制的,官方给出的资料显示,iPhone OS下的主线程的堆栈大小是1M,第二个线程开始就是512KB,并且该值不能通过编译器开关或线程API函数来更改,只有主线程有直接修改UI的

ios开发:GCD多线程

ios有三种多线程编程技术,分别是NSThread,Cocoa NSOperation和GCD,GCD全称Grand Central Dispatch 是Apple开发的一个多核编程的解决方法,在iOS4.0开始之后才能使用.GCD是一个可以替代NSThread, NSOperationQueue, NSInvocationOperation等技术的很高效和强大的技术,而且其使用起来比前两者更加的简单方便,今天主要给大家介绍一下有关GCD的使用. GCD的工作原理是:让程序平行排队的特定任务,根

在iOS开发为什么使用多线程 ,多线程有哪些方法。

多线程是一个比较轻量级的方法来实现单个应用程序内多个代码执行路径 在系统级别内,程序并排执行,程序分配到每个程序的执行时间是基于该程序的所需时间和其他程序的所需时间来决定的. 然而,在每个程序内部,存在一个或者多个执行线程,它同时或在一个几乎同时发生的方式里执行不同的任务. 概要提示: iPhone中的线程应用并不是无节制的,官方给出的资料显示,iPhone OS下的主线程的堆栈大小是1M,第二个线程开始就是512KB,并且该值不能通过编译器开关或线程API函数来更改,只有主线程有直接修改UI的

iOS开发:NSThread多线程的使用

一:创建线程,NSThread创建线程常用的三种方式: //1:手动创建启动 let thread:NSThread = NSThread(target: self, selector:"doSomething:", object: "param") thread.name = "childThread1" //手动创建线程的方式可以设置线程的名称 thread.start() //2:创建完成自动start NSThread.detachNew

iOS开发关于GCD多线程方面的知识(1)

1.同步和异步 (1)同步(sync):A线程要请求某个资源,但是此资源正在被B线程使用中,因为同步机制存在,A线程请求 不到,怎么办,A线程只能等待下去 (2)异步(async):A线程要请求某个资源,但是此资源正在被B线程使用中,因为没有同步机制存在,A线程 仍然请求的到,A线程无需等待

iOS开发网络篇—大文件的多线程断点下载(转)

http://www.cnblogs.com/wendingding/p/3947550.html iOS开发网络篇—多线程断点下载 说明:本文介绍多线程断点下载.项目中使用了苹果自带的类,实现了同时开启多条线程下载一个较大的文件.因为实现过程较为复杂,所以下面贴出完整的代码. 实现思路:下载开始,创建一个和要下载的文件大小相同的文件(如果要下载的文件为100M,那么就在沙盒中创建一个100M的文件,然后计算每一段的下载量,开启多条线程下载各段的数据,分别写入对应的文件部分). 项目中用到的主要