官方文檔
混淆的地方
最大線程數量&當maxConcurrentOperationCount = 1 queue爲串行隊列&控制NSBlockOperation的多少.
實踐
一.maxConcurrentOperationCount = 1時
1.純NSBlockOperation驗證
NSBlockOperation *blockop1 = [NSBlockOperation blockOperationWithBlock:^{
for (NSInteger i=0; i<5;i++ ) {
[NSThread sleepForTimeInterval:2];
NSLog(@"block1---0操作 %@",[NSThread currentThread]);
}
}];
[blockop1 addExecutionBlock:^{
for (NSInteger i=0; i<4;i++ ) {
[NSThread sleepForTimeInterval:2];
NSLog(@"block1-----1操作 %@",[NSThread currentThread]);
}
}];
[blockop1 addExecutionBlock:^{
for (NSInteger i=0; i<3;i++ ) {
[NSThread sleepForTimeInterval:2];
NSLog(@"block1add-----2操作 %@",[NSThread currentThread]);
}
}];
NSBlockOperation *blockop2 = [NSBlockOperation blockOperationWithBlock:^{
for (NSInteger i=0; i<7;i++ ) {
[NSThread sleepForTimeInterval:2];
NSLog(@"block2----總操作 %@",[NSThread currentThread]);
}
}];
[blockop2 addExecutionBlock:^{
for (NSInteger i=0; i<6;i++ ) {
[NSThread sleepForTimeInterval:2];
NSLog(@"block2add-----1操作 %@",[NSThread currentThread]);
}
}];
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
queue.maxConcurrentOperationCount = 1;
[queue addOperations:@[blockop1,blockop2] waitUntilFinished:NO];
打印
當queue中有2個任務操作時 queue.maxConcurrentOperationCount = 1會開啓新的線程所以同一時間執行同一類型的任務操作
2.純NSInvocationOperation驗證
NSInvocationOperation *inoperation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test) object:nil];
NSInvocationOperation *inoperation2 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test) object:nil];
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
queue.maxConcurrentOperationCount = 1;
[queue addOperations:@[inoperation,inoperation2] waitUntilFinished:NO];
打印
當queue中有2個任務操作時 queue.maxConcurrentOperationCount = 1同一時間執行同一類型的任務操作
3.NSInvocationOperation+NSBlockOperation驗證
NSBlockOperation *blockop1 = [NSBlockOperation blockOperationWithBlock:^{
for (NSInteger i=0; i<5;i++ ) {
[NSThread sleepForTimeInterval:2];
NSLog(@"block1---0操作 %@",[NSThread currentThread]);
}
}];
[blockop1 addExecutionBlock:^{
for (NSInteger i=0; i<4;i++ ) {
[NSThread sleepForTimeInterval:2];
NSLog(@"block1-----1操作 %@",[NSThread currentThread]);
}
}];
[blockop1 addExecutionBlock:^{
for (NSInteger i=0; i<3;i++ ) {
[NSThread sleepForTimeInterval:2];
NSLog(@"block1add-----2操作 %@",[NSThread currentThread]);
}
}];
NSInvocationOperation *inoperation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test) object:nil];
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
queue.maxConcurrentOperationCount = 1;
[queue addOperations:@[blockop1,inoperation] waitUntilFinished:NO];
打印:
當queue中有2個任務操作時 queue.maxConcurrentOperationCount = 1也會開啓新的線程 同一時間片執行了同一類型的任務操作