您的位置:首页 > 移动开发 > IOS开发

iOS中的多线程------+NSThread与NSOperation

2014-11-08 15:33 162 查看
iOS中的多线程编程技术有三种,包括NSThread、NSOperation、GCD;今天先说一下前两种多线程技术的应用。

一、NSThread来创建一个多线程,有两种方法来创建多线程;

1.工厂方法来创建一个多线程。

[objc] view
plaincopy

[NSThread detachNewThreadSelector:@selector(doSomething:) toTarget:self  

withObject:@"hi"];  

2.通过实例化一个NSThread对象来创建一个多线程

[objc] view
plaincopy

NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(doSomething:)  

object:@"hi"];  

[objc] view
plaincopy

[thread start];  

实例化方法要注意的一点是,在创建了多线程之后,要将其开启,也就是上述的[thread start];来开启这个线程。

3.利用perform来创建一个多线程。

1)创建一个多线程

[objc] view
plaincopy

[self performSelectorInBackground:@selector(doSomething) withObject:@"hi"];  

这里需要注意的一点是,方法里的Inbackground并不是开启后台的线程,其实这个线程的开启的时机是在执行到这句话的时候就会开启这个多线程。

2)利用perform执行切换到主线程并执行一些列动作。

[objc] view
plaincopy

self performSelectorOnMainThread:@selector(doSomething) withObject:@"hi"  

waitUntilDone:YES];  

注意:最后一个参数waitUntilDone:表示是否阻塞这个方法的调用,如果为YES则表示阻塞,需等待主线程中正在运行的方法结束。

3)在指定线程中执行,需要注意的一点是:这个线程必须具备run loop

4.NSOperation创建线程的方法。

      1) 利用NSOperation来创建多线程的时候,首先要创建一个线程队列,然后定义子任务,这些子任务则必须是NSOperation的子类。然后将这些子任务添加到线程队列中,则会自动开启多线程。

a.创建一个队列

[objc] view
plaincopy

NSOperationQueue queue =[[NSOperationQueue alloc]init];  

b.创建子任务(子任务必须是NSOperation的子类)

[objc] view
plaincopy

NSInvocationOperation operation =[[NSInvocationOperation alloc]initWithTarget:self  

selector:@selector(doSomething:) object:@"hi"];  

c.把当前的任务添加到线程队列中,则会自动开启线程。

[objc] view
plaincopy

[queue addOperation:operation];  

需要注意的一点是,在这里可以创建多个多线程,可以全部或部分添加到线程队列中。

2)利用block快来添加数据

[objc] view
plaincopy

NSOperationQueue queue =[[NSOperationQueue alloc]init];  

[objc] view
plaincopy

NSBlockOperation operation =[NSBlockOperation blockOperationWithBlock:^{ [self doSomething]}];  

[objc] view
plaincopy

[queque addOperation:oper];  

block块相对于上述的方法的好处是,block块能够获取到当前文件的成员变量,并直接使用。

5.常见的一些NSThread的方法:

1. +(NSThread *)currentThread; //获得当前线程

2. +(void)sleepForTimeInterval:(NSTimeInterval)ti; //线程休眠

3. +(NSThread *)mainThread; //主线程,亦即UI线程了

4. -(BOOL)isMainThread; + (BOOL)isMainThread; //当前线程是否主线程

5. -(BOOL)isExecuting; //线程是否正在运行

6. -(BOOL)isFinished; //线程是否已结束
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: