NSOperationQueue作用:
NSOperation可以調用start方法來執行任務,但默認是同步執行的;如果將NSOperation添加到NSOperationQueue中,系統會自動異步執行NSOperation中的操作;
添加操作到NSOperationQueue中:
- (void)addOperation:(NSOperation *)p;
- (void)addOperationWithBlock:(void (^)(void))block;
最大併發數: 同時執行任務的最大數;開啓新線程的最大數;
隊列的取消、暫停、恢復:
取消操作:
- (void)cancelAllOperation; (隊列方法,全部取消)
- (void)cancle; (操作方法,取消單個操作)
暫停和恢復:
- (void)setSuspended(BOOL)b; //YES代表暫停隊列,NO代表恢復隊列;
使用場景:在一個UITableView中,有加載數據圖片的時候,當你滑動表單時,可以暫停隊列任務,當你停止滑動,你就可以恢復隊列任務;
操作優先級:
1,設置NSOperation在queue中的優先級,可以改變操作的執行優先級;
- (NSOperationQueuePriority)queuePriority;
- (void)setQueuePriority:(NSOperationQueuePriority)p;
2,優先級的取值;
(1)NSOperationQueuePriorityVeryLow = -8L;
(2)NSOperationQueuePriorityLow = -4L;
(3)NSOperationQueuePriorityNormal = 0;
(4)NSOperationQueuePriorityHigh = 4;
(5)NSOperationQueuePriorityVeryHigh = 8;
操作依賴:
1,NSOperation之間可以設置依賴來保證執行順序;
比如一定要讓操作A執行完後,才能執行操作B,可以這麼寫
[operationB addDependency:operationA]; //操作B依賴於操作A
2,可以不同queue的NSOperation之間創建依賴關係;
監聽:
- (void)opeationListen
{
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
for (int i = 0; i<10; i++) {
NSLog(@"NSBlockOperation------下載圖片---%@", [NSThread currentThread]);
}
}];
operation.completionBlock = ^{
// ...下載完圖片後想做事情
NSLog(@"NSBlockOperation------下載圖片完畢---%@", [NSThread currentThread]);
};
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue addOperation:operation];
}
自定義NSOperation:
當我們不想用系統給我們的Operation,我們可以自定義NSOperation,在下載圖片的過程就可以用到;
1,重寫 - (void)main函數;
注意:(1)因爲如果void函數裏面執行的是子線程(異步)操作,而autoreleasepool在主線程中,無法訪問主線程的自動釋放池,所以最好在- (void)main中創建一個@autoreleasepool{};
(2)經常通過-(BOOL)isCancelled方法檢測操作是否被取消,對取消做出響應;
代碼:
/**
* 在main方法中實現具體操作
*/
- (void)main
{
@autoreleasepool {
NSURL *downloadUrl = [NSURL URLWithString:self.url];
NSData *data = [NSData dataWithContentsOfURL:downloadUrl]; // 這行會比較耗時
UIImage *image = [UIImage imageWithData:data];
if ([self.delegate respondsToSelector:@selector(downloadOperation:didFinishDownload:)]) {
dispatch_async(dispatch_get_main_queue(), ^{ // 回到主線程, 傳遞圖片數據給代理對象
[self.delegate downloadOperation:self didFinishDownload:image];
});
}
}
}