一、併發數
(1)併發數:同時執⾏行的任務數.比如,同時開3個執行緒執行3個任務,併發數就是3
(2)最大併發數:同一時間最多隻能執行的任務的個數。
(3)最⼤大併發數的相關⽅方法
- (NSInteger)maxConcurrentOperationCount;
- (void)setMaxConcurrentOperationCount:(NSInteger)cnt;
- (void)setMaxConcurrentOperationCount:(NSInteger)cnt;
說明:如果沒有設定最大併發數,那麼併發的個數是由系統記憶體和CPU決定的,可能記憶體多久開多一點,記憶體少就開少一點。
注意:num的值並不代表執行緒的個數,僅僅代表執行緒的ID。
提示:最大併發數不要亂寫(5以內),不要開太多,一般以2~3為宜,因為雖然任務是在子執行緒進行處理的,但是cpu處理這些過多的子執行緒可能會影響UI,讓UI變卡。
二、佇列的取消,暫停和恢復
(1)取消佇列的所有操作
- (void)cancelAllOperations;
提⽰:也可以呼叫NSOperation的- (void)cancel⽅法取消單個操作
(2)暫停和恢復佇列
- (void)setSuspended:(BOOL)b; // YES代表暫停佇列,NO代表恢復佇列
- (BOOL)isSuspended; //當前狀態
(3)暫停和恢復的適用場合:在tableview介面,開執行緒下載遠端的網路介面,對UI會有影響,使使用者體驗變差。那麼這種情況,就可以設定在使用者操作UI(如滾動螢幕)的時候,暫停佇列(不是取消佇列),停止滾動的時候,恢復佇列。
三、操作優先順序
(1)設定NSOperation在queue中的優先順序,可以改變操作的執⾏優先順序
- (NSOperationQueuePriority)queuePriority;
- (void)setQueuePriority:(NSOperationQueuePriority)p;
(2)優先順序的取值
NSOperationQueuePriorityVeryLow = -8L,
NSOperationQueuePriorityLow = -4L,
NSOperationQueuePriorityNormal = 0,
NSOperationQueuePriorityHigh = 4,
NSOperationQueuePriorityVeryHigh = 8
說明:優先順序高的任務,呼叫的機率會更大。
四、操作依賴
(1)NSOperation之間可以設定依賴來保證執行順序,⽐如一定要讓操作A執行完後,才能執行操作B,可以像下面這麼寫
[operationB addDependency:operationA]; // 操作B依賴於操作
(2)可以在不同queue的NSOperation之間建立依賴關係
- (void)viewDidLoad { [super viewDidLoad]; /***********************************************************/ NSInvocationOperation *operation1=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test1) object:self]; NSInvocationOperation *operation2=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test2) object:nil]; NSBlockOperation *operation3=[NSBlockOperation blockOperationWithBlock:^{ for(int i=0;i<5;i++){ NSLog(@"NSBlockOperation--1--%@",[NSThread currentThread]); } }]; [operation3 addExecutionBlock:^{ for (int i=0; i<5; i++) { NSLog(@"NSBlockOperation--2--%@",[NSThread currentThread]); } }]; //設定操作依賴 //先執行operation2,再執行operation1,最後執行operation3 [operation3 addDependency:operation1]; [operation1 addDependency:operation2]; //不能是相互依賴 // [operation3 addDependency:operation1]; // [operation1 addDependency:operation3]; NSOperationQueue *queue=[[NSOperationQueue alloc]init]; [queue addOperation:operation1]; [queue addOperation:operation2]; [queue addOperation:operation3]; /*****************************監聽**************************/ //建立物件,封裝操作 NSBlockOperation *operation=[NSBlockOperation blockOperationWithBlock:^{ for (int i=0; i<10; i++) { NSLog(@"-operation-下載圖片-%@",[NSThread currentThread]); } }]; //監聽操作的執行完畢 operation.completionBlock=^{ //.....下載圖片後繼續進行的操作 NSLog(@"--接著下載第二張圖片--"); }; //建立佇列 NSOperationQueue *queue1=[[NSOperationQueue alloc]init]; //把任務新增到佇列中(自動執行,自動開執行緒) [queue1 addOperation:operation]; /***********************************************************/ } -(void)test1{ NSLog(@"NSInvocationOperation-test1-%@",[NSThread currentThread]); } -(void)test2{ NSLog(@"NSInvocationOperation-test2-%@",[NSThread currentThread]); }