執行緒10--NSOperation的基本操作

有稜角的圓發表於2016-08-01
一、併發數
(1)併發數:同時執⾏行的任務數.比如,同時開3個執行緒執行3個任務,併發數就是3
(2)最大併發數:同一時間最多隻能執行的任務的個數。
(3)最⼤大併發數的相關⽅方法
- (NSInteger)maxConcurrentOperationCount;
- (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]);
    
}

 

相關文章