首页 > 其他 > 详细

Operation与GCD的不同

时间:2015-10-31 18:20:54      阅读:360      评论:0      收藏:0      [点我收藏+]

最大并发数:

什么是并发数?

同时执行的任务数。比如同时开启三个线程执行三个任务,并发数就是3.

最大并发数相关的方法:

-(NSInteger)maxConcurrentOperationCount;

-(void)setMaxConcurrentOperationCount:(NSInteger)cnt;

剖析最大并发数:并发数就是同时执行操作的数量,并不是只线程的个数。就是指同时执行任务的个数,当一个线程执行完毕后会有一个回收到线程池的过程,这时如果线程池中还有别的线程就会直接拿出来进行任务的执行。如果线程池中没有线程,就会等待回收后的线程。

注:最大线程个数是由CPU内核决定的

GCD与NSOPeration的线程的不同之处

1。我们知道GCD的线程大体可分为六大中,同步串行队列(不开辟线程),同步并行队列(开辟线程),异步串行队列(开辟线程),异步并行队列(开辟线程),主队列, 全局队列。

    但是我们知道开辟线程和耗费内存,而GCD中方法虽多,但是很多我们开辟线程并没有意义,反而会耗费内存。NSOPeration其实是对GCD中的一个封装,但是他并没有封装GCD中所有的方法。NSOperationQueue创建出来的对象相当于异步并行队列,NSInvocationOperation如有start这相当于同步串行队列。NSBlockOperation将创建的对象加到NSOperationQueue创建队列中,相当一异步串行

 NSOperationQueue * q = [NSOperationQueue mainQueue]相当于GCD的主队列

 

2.队列的取消、暂停、和恢复NSOPeration有,GCD是没有的

取消队列的所有操作

-(void)cancelAllOperations;

提示:也可以调用NSOperation的-(void)cancel方法取消单个操作。

暂停和恢复队列

-(void)setSuspended:(BOOL)b; // YES表示暂停队列 NO表示恢复队列

-(BOOL)isSuspend;

获取队列操作数:

operationCount(只读属性)

注意:

(1)暂停不会删除队列内的操作。只是把队列挂起。暂停和挂起都是针对队列而言的。暂停后还可以重新恢复接着原来的任务进行执行。

(2)取消全部任务的操作会清空队列里的所有任务。

(3)暂停和取消都是对队列里的操作而言的,而正在执行的操作是无法取消或暂停的。

在实际的开发中:通常定义一个全局的操作队列, 然后就可以把所有的任务都添加进去。在开发中需要注意的两点:

(1)在用户点击”暂停/继续”的按钮触发的事件中,需要先判断当前队列内是否有任务,如果全局队列内没有任务就直接return返回,从而没有任务的时候不会改变队列的挂起和恢复状态。

(2)在用户点击”取消全部操作”的按钮触发的事件中,取消操作之后需要重置全局队列为恢复状态,这样不管原先全局队列的状态如何,在取消全部操作之后又重新置于初始状态。从而不会影响新的操作。

 代码

- (void) viewDidLoad
{
    self.view.backgroundColor = [UIColor whiteColor];
    
    UIButton * downButton = [UIButton buttonWithType:UIButtonTypeCustom];
    downButton.frame = CGRectMake(20, 80, 200, 60);
    [downButton setBackgroundColor:[UIColor greenColor]];
    [downButton addTarget:self action:@selector(download) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:downButton];
}

- (void) download
{
    if (self.opQueue.operationCount == 0) {
        NSLog(@"没有操作");
        return;
    }
    //暂停,继续
    self.opQueue.suspended = !self.opQueue.suspended;
    if (self.opQueue.suspended) {
        NSLog(@"暂停");
    }
    else
    {
        NSLog(@"继续");
    }

}
- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
//    [self opDemo1];
//    [self opDemo2];
//    [self opDemo3];
//    [self opDemo4];
    [self opDemo5];
}
//懒加载
- (NSOperationQueue *)opQueue
{
    if(_opQueue == nil)
    {
        _opQueue = [[NSOperationQueue alloc] init];
    }
    return _opQueue;
    
}

#pragma mark - 线程间通信
- (void) opDemo5
{ 
    self.opQueue = [[NSOperationQueue alloc] init];
//maxConcurrentOperationCount 必须要设,否者暂停不了
//个人理解,若不设置最大并发数,则所有任务并发执行,而暂停操作只能暂停还没开始的任务。下载中的任务不会暂停
//maxCincurrentOpertaionCount为多少,暂停下载后。就会有多少任务下载完成,因为点击暂停时,还有这么多人物在执行中 self.opQueue.maxConcurrentOperationCount
= 1; NSLog(@"+1"); for (int i = 0; i < 500; i ++) { NSOperation * op = [NSBlockOperation blockOperationWithBlock:^{ [NSThread sleepForTimeInterval:1]; NSLog(@"%d 耗时操作 ===== %@", i,[NSThread currentThread]); }]; [self.opQueue addOperation:op]; } NSLog(@"+3"); }

 

 

 

 

Operation与GCD的不同

原文:http://www.cnblogs.com/YU411524/p/4925120.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!