一、隊(duì)列里可以加入很多個(gè)NSOperation, 可以把NSOperationQueue看作一個(gè)線程池,可往線程池中添加操作(NSOperation)到隊(duì)列中。線程池中的線程可看作消費(fèi)者,從隊(duì)列中取走操作,并執(zhí)行它
二、隊(duì)列類型
1、主隊(duì)列:添加到主隊(duì)列的操作,都會(huì)放到主線程中執(zhí)行
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
self.imageView.image = image;
}];
2.非主隊(duì)列
[[[NSOperationQueue alloc] init] addOperationWithBlock:^{
NSLog(@"下載圖片3---%@", [NSThread currentThread]);
}];
3.添加隊(duì)列的方式
- (void)addOperation:(NSOperation *)op;
- (void)addOperationWithBlock:(void (^)(void))block
三、基本用法
// 1.創(chuàng)建一個(gè)隊(duì)列(非主隊(duì)列)
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
// 2.添加操作到隊(duì)列中(自動(dòng)異步執(zhí)行任務(wù),并發(fā))
NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"下載圖片1---%@", [NSThread currentThread]);
}];
NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"下載圖片2---%@", [NSThread currentThread]);
}];
[queue addOperation:operation1];
[queue addOperation:operation2];
[queue addOperationWithBlock:^{
NSLog(@"下載圖片3---%@", [NSThread currentThread]);
}];
// 3個(gè)操作并發(fā)執(zhí)行
四、常見用法
1.最大并發(fā)數(shù)
// 1.創(chuàng)建一個(gè)隊(duì)列(非主隊(duì)列)
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
// 2.設(shè)置最大并發(fā)(最多同時(shí)并發(fā)執(zhí)行3個(gè)任務(wù))
queue.maxConcurrentOperationCount = 3;
[queue setMaxConcurrentOperationCount:3];
2.取消所有隊(duì)列
[queue cancelAllOperations]; // 取消隊(duì)列中的所有任務(wù)(不可恢復(fù))
3.暫停所有隊(duì)列
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
[queue setSuspended:YES]; // 暫停隊(duì)列中的所有任務(wù)
}
4.恢復(fù)所有操縱
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
[queue setSuspended:NO]; // 恢復(fù)隊(duì)列中的所有任務(wù)
}
5.依賴
假設(shè)有A、B、C三個(gè)操作,要求:
1. 3個(gè)操作都異步執(zhí)行
2. 操作C依賴于操作B
3. 操作B依賴于操作A
在不同queue的NSOperationQueue之間建立依賴關(guān)系
// 1.創(chuàng)建一個(gè)隊(duì)列(非主隊(duì)列)
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
// 2.創(chuàng)建3個(gè)操作
NSBlockOperation *operationA = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"A1---%@", [NSThread currentThread]);
}];
NSBlockOperation *operationB = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"B---%@", [NSThread currentThread]);
}];
NSBlockOperation *operationC = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"C---%@", [NSThread currentThread]);
}];
// 設(shè)置依賴
[operationB addDependency:operationA];
[operationC addDependency:operationB];
// 3.添加操作到隊(duì)列中(自動(dòng)異步執(zhí)行任務(wù))
[queue addOperation:operationC];
[queue addOperation:operationA];
[queue addOperation:operationB];
6.線程之間的通信
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue addOperationWithBlock:^{
// 1.異步下載圖片
NSURL *url = [NSURL URLWithString:@"http://d.hiphotos.baidu.com/image/pic/item/37d3d539b6003af3290eaf5d362ac65c1038b652.jpg"];
NSData *data = [NSData dataWithContentsOfURL:url];
UIImage *image = [UIImage imageWithData:data];
// 2.回到主線程,顯示圖片
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
self.imageView.image = image;
}];
}];