多线程之NSOperation:

多线程的优点:

  1. 使用线程可以把占据时间长的程序中的任务呀放到后台去处理
  2. 用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度
  3. 程序的运行速度可能加快
  4. 在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下可以释放一些珍贵的资源如内存占用等等。

多线程的缺点:

  1. 如果有大量的线程,会影响性能,因为操作系统需要在它们之间切换。
  2. 更多的线程需要更多的内存空间。
  3. 线程可能会给程序带来更多“bug”,因此要小心使用。
  4. 线程的中止需要考虑其对程序运行的影响。
  5. 通常块模型数据是在多个线程间共享的,需要防止线程死锁情况的发生。

使用NSOperation和NSOperationQueue实现多线程

  1. 创建NSOperation
  2. 把创建的NSOperation对象方法添加到NSOperationQueue中
  3. 系统自动去NSOperationQueue操作队列中取到一个NSOperation对象,并开启一个分线程去执行操作

     注意:

  1. NSOperation是一个抽象类,不具备创建对象的能力。
  2. 我们可以使用NSOperation的子类去创建对象(NSInvocationOperation, NSBlockOperation)
  3. 我们也可以自定义NSOperation

NSInvocationOperation

 

NSInvocationOperation *operation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(operationText) object:nil];
[operation start];

 NSInvocationOperation创建的对象默认实在主线程中执行。

NSInvocationOperation *operation1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(operationText) object:nil];
NSInvocationOperation *operation2 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(operationText) object:nil];
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
[queue addOperation:operation1];
[queue addOperation:operation2];

 将操作放入队列中,在分线程中执行。

[queue setMaxConcurrentOperationCount:5];

 队列以此可以最多执行的分线程。超出,则先执行完,在执行多余的。

 

NSBlockOperation

NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{
        [NSThread sleepForTimeInterval:5];
        NSLog(@"方法 :%d",[NSThread isMainThread]);
    }];
[operation2 start];

 NSBlockOperation创建的对象默认是在主线程中执行的。

NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{
        [NSThread sleepForTimeInterval:5];
        NSLog(@"方法 :%d",[NSThread isMainThread]);
    }];
[operation2 addExecutionBlock:^{
        [NSThread sleepForTimeInterval:5];
        NSLog(@"方法1 :%d",[NSThread isMainThread]);
    }];
[operation2 start]

 我们可以在block中添加其它任务,其它任务正常情况下是在分线程中执行。

NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"方法1 :%d",[NSThread isMainThread]);
    }];
NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"方法2 :%d",[NSThread isMainThread]);
    }];
    
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
[queue addOperation:operation1];
[queue addOperation:operation2];

 这样创建的方法都在分线程中执行。

自定义NSOperation对象

我们需要创建一个类,继承自NSOperation.

在类中实现-(void)main(){//实现的内容}

myOperation *operation1 = [[myOperation alloc]init];
myOperation *operation2 = [[myOperation alloc]init];
myOperation *operation3 = [[myOperation alloc]init];
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
[queue addOperation:operation1];
[queue addOperation:operation2];
[queue addOperation:operation3];

 我们可以设定操作对象的执行顺序。

  1. 通过依赖关系
  2. 通过优先级
[operation1 addDependency:operation2];

 operation1依赖operation2,先执行operation2,再执行operation1

[operation3 setQueuePriority:NSOperationQueuePriorityHigh];

 设置operation3的优先级

 取消操作

[operation1 cancel];

 取消某个操作。

[queue cancelAllOperations];

 取消队列中的所有操作。

暂停操作

[queue setSuspended:YES];
[queue setSuspended:NO];