NSOperationQueue 的整理

本文详细解析了NSOperationQueue的并发操作机制,通过多个实例展示了如何合理使用NSOperationQueue来优化多任务执行流程。从创建任务、设置最大并发数到任务间的依赖关系处理,每一步都配有实例代码及运行结果分析,帮助开发者深入理解并有效应用这一关键技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

@interface YkMainViewController : UIViewController <YkFlipsideViewControllerDelegate>
{
    NSOperationQueue *operationQueue; 
    BOOL b_init;
}

 

@interface MyTask : NSOperation
{
    int operationId;
}

@property int operationId;
@end

 

#import "MyTask.h"

@implementation MyTask
@synthesize operationId;

- (void)main{ 
    NSLog(@"task %i is begin run … ",operationId); 
    [NSThread sleepForTimeInterval:10]; 
    NSLog(@"task %i is run finished. ",operationId); 
}


@end

 

 

---------开始使用:场景1:

- (void)viewDidLoad
{
    [super viewDidLoad];
	// Do any additional setup after loading the view, typically from a nib.
    
    if(!b_init)
    {
        operationQueue = [[NSOperationQueue alloc] init];
        [operationQueue setMaxConcurrentOperationCount:1];  
        
        int index = 1;
        MyTask * _task1 = [[[MyTask alloc] init] autorelease];
        _task1.operationId = index++;
        [operationQueue addOperation:_task1];
    }        
    b_init = YES;
}

 结果:

2011-11-24 11:23:34.222 NSOperationQueueTest[2719:12d0b] task 1 is begin run …
2011-11-24 11:23:44.225 NSOperationQueueTest[2719:12d0b] task 1 is run finished.

 

场景2:

       operationQueue = [[NSOperationQueue alloc] init];
        [operationQueue setMaxConcurrentOperationCount:1];  
        
        int index = 1;
        MyTask * _task1 = [[[MyTask alloc] init] autorelease];
        _task1.operationId = index++;
        [operationQueue addOperation:_task1];
        
        MyTask * _task2 = [[[MyTask alloc] init] autorelease];
        _task2.operationId = index++; 
        
        [operationQueue addOperation:_task2];

 结果:

2011-11-24 11:24:40.516 NSOperationQueueTest[2769:12e0b] task 1 is begin run …
2011-11-24 11:24:50.518 NSOperationQueueTest[2769:12e0b] task 1 is run finished.
2011-11-24 11:24:50.527 NSOperationQueueTest[2769:12e0b] task 2 is begin run …
2011-11-24 11:25:00.529 NSOperationQueueTest[2769:12e0b] task 2 is run finished.

 

 

场景3:

     operationQueue = [[NSOperationQueue alloc] init];
        [operationQueue setMaxConcurrentOperationCount:2];  
        
        int index = 1;
        MyTask * _task1 = [[[MyTask alloc] init] autorelease];
        _task1.operationId = index++;
        [operationQueue addOperation:_task1];
        
        MyTask * _task2 = [[[MyTask alloc] init] autorelease];
        _task2.operationId = index++;
        
        [operationQueue addOperation:_task2];

 

结果:

2011-11-24 11:25:41.663 NSOperationQueueTest[2815:11503] task 1 is begin run …
2011-11-24 11:25:41.663 NSOperationQueueTest[2815:12d0b] task 2 is begin run …
2011-11-24 11:25:51.667 NSOperationQueueTest[2815:11503] task 1 is run finished.
2011-11-24 11:25:51.669 NSOperationQueueTest[2815:12d0b] task 2 is run finished.

或者

2011-11-24 11:25:41.663 NSOperationQueueTest[2815:11503] task 1 is begin run …
2011-11-24 11:25:41.663 NSOperationQueueTest[2815:12d0b] task 2 is begin run …
2011-11-24 11:25:51.669 NSOperationQueueTest[2815:12d0b] task 2 is run finished.
2011-11-24 11:25:51.670 NSOperationQueueTest[2815:11503] task 1 is run finished.

。。。

 

场景4:

  operationQueue = [[NSOperationQueue alloc] init];
        [operationQueue setMaxConcurrentOperationCount:2];  
        
        int index = 1;
        MyTask * _task1 = [[[MyTask alloc] init] autorelease];
        _task1.operationId = index++;
        [operationQueue addOperation:_task1];
        
        MyTask * _task2 = [[[MyTask alloc] init] autorelease];
        _task2.operationId = index++;
        [_task2 addDependency:_task1]; 
        
        [operationQueue addOperation:_task2];

 结果:

2011-11-24 11:27:00.820 NSOperationQueueTest[2859:11603] task 1 is begin run …
2011-11-24 11:27:10.823 NSOperationQueueTest[2859:11603] task 1 is run finished.
2011-11-24 11:27:10.830 NSOperationQueueTest[2859:13507] task 2 is begin run …
2011-11-24 11:27:20.832 NSOperationQueueTest[2859:13507] task 2 is run finished.

 

场景5:

      operationQueue = [[NSOperationQueue alloc] init];
        [operationQueue setMaxConcurrentOperationCount:2];  
        
        int index = 1;
        MyTask * _task1 = [[[MyTask alloc] init] autorelease];
        _task1.operationId = index++;
        
        
        MyTask * _task2 = [[[MyTask alloc] init] autorelease];
        _task2.operationId = index++;
        [_task2 addDependency:_task1]; 
        
        
        [operationQueue addOperation:_task2]; [operationQueue addOperation:_task1];

 结果:

2011-11-24 11:29:19.807 NSOperationQueueTest[2945:11503] task 1 is begin run …
2011-11-24 11:29:29.809 NSOperationQueueTest[2945:11503] task 1 is run finished.
2011-11-24 11:29:29.817 NSOperationQueueTest[2945:12d0f] task 2 is begin run …
2011-11-24 11:29:39.818 NSOperationQueueTest[2945:12d0f] task 2 is run finished.

 场景6:

 operationQueue = [[NSOperationQueue alloc] init];
        [operationQueue setMaxConcurrentOperationCount:2];  
        
        int index = 1;
        MyTask * _task1 = [[[MyTask alloc] init] autorelease];
        _task1.operationId = index++;
        
        
        MyTask * _task2 = [[[MyTask alloc] init] autorelease];
        _task2.operationId = index++;
        [_task2 addDependency:_task1]; 
        
        
        [operationQueue addOperation:_task2];
        [operationQueue addOperation:_task1];
        
        NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(doSomethingInBackground) object:nil];
        
        [operationQueue addOperation:operation]; 
- (void) doSomethingInBackground
{
    NSLog(@"doSomethingInBackground");
}

 

结果:

2011-11-24 11:32:15.211 NSOperationQueueTest[3038:11503] doSomethingInBackground
2011-11-24 11:32:15.211 NSOperationQueueTest[3038:12d0b] task 1 is begin run …
2011-11-24 11:32:25.215 NSOperationQueueTest[3038:12d0b] task 1 is run finished.
2011-11-24 11:32:25.225 NSOperationQueueTest[3038:12d0b] task 2 is begin run …
2011-11-24 11:32:35.226 NSOperationQueueTest[3038:12d0b] task 2 is run finished.

 

转载于:https://www.cnblogs.com/GnagWang/archive/2011/11/24/2261400.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值