(一)隊列裏可以加入很多個NSOperation, 可以把NSOperationQueue看作一個線程池,可往線程池中添加操作(NSOperation)到隊列中。線程池中的線程可看作消費者,從隊列中取走操作,並執行它。
(二)隊列類型
1、主隊列:添加到主隊列的操作,都會放到主線程中執行。
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
self.imageView.image = image;
}];
2、非主隊列:添加到非主隊列的操作,都會放到子線程中執行。
[[[NSOperationQueue alloc] init] addOperationWithBlock:^{
NSLog(@"下載圖片3---%@", [NSThread currentThread]);
}];
(三)隊列添加任務的方式
- (void)addOperation:(NSOperation *)op;
- (void)addOperationWithBlock:(void (^)(void))block
(四)基本用法
// 1.創建一個隊列(非主隊列)
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
// 2.添加操作到隊列中(自動異步執行任務,併發)
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個操作併發執行
(四)常見用法
1、最大併發數
// 1.創建一個隊列(非主隊列)
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
// 2.設置最大併發(最多同時併發執行3個任務)
queue.maxConcurrentOperationCount = 3;
[queue setMaxConcurrentOperationCount:3];
2、取消所有操作
[queue cancelAllOperations]; // 取消隊列中的所有任務(不可恢復)
3、暫停所有操作
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
[queue setSuspended:YES]; // 暫停隊列中的所有任務
}
4、恢復所有操作
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
[queue setSuspended:NO]; // 恢復隊列中的所有任務
}
5、依賴:可以在不同queue的NSOperationQueue之間建立依賴關係
/**
假設有A、B、C三個操作,要求:
1. 3個操作都異步執行
2. 操作C依賴於操作B
3. 操作B依賴於操作A
*/
// 1.創建一個隊列(非主隊列)
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
// 2.創建3個操作
NSBlockOperation *operationA = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"A1---%@", [NSThread currentThread]);
}];
NSBlockOperation *operationB = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"B---%@", [NSThread currentThread]);
}];
NSBlockOperation *operationC = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"C---%@", [NSThread currentThread]);
}];
// 設置依賴
[operationB addDependency:operationA];
[operationC addDependency:operationB];
// 3.添加操作到隊列中(自動異步執行任務)
[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;
}];
}];