1. 程式人生 > >OC開執行緒的三種方式

OC開執行緒的三種方式

第一種NSThread 


   //NSThread 方法1 需要手動start];
    NSThread *thread=[[NSThread alloc]initWithTarget:self selector:@selector(threadRun:) object:@"引數"];
   thread.name [email protected]"執行緒1";
    //優先順序 0.0-1.0 預設0.5 0.0最低1.0最高
    thread.threadPriority=0.6;




  [thread start];
    
    //NSThread 方法2
    [NSThread detachNewThreadSelector:@selector(threadRun:) toTarget:self withObject:@"引數"];
      //NSThread 方法3
    [self performSelectorInBackground:@selector(threadRun:) withObject:@"引數"];
    
}


//多個引數可以用陣列或者字典
-(void)threadRun:(NSString *)param{
    
      //回到主執行緒
    [self  performSelectorOnMainThread:@selector(update) withObject:nil waitUntilDone:YES];
}


第二種 GCD
-(void)gcdThread{
    
    /**第一種自己建立佇列
     第一個引數:C語言的字串,標籤隨便填
     第二個引數 佇列的型別。
     DISPATCH_QUEUE_CONCURRENT併發 //開多條執行緒
     DISPATCH_QUEUE_SERIAL 序列 只開一條執行緒
     */
//    dispatch_queue_t queue= dispatch_queue_create("com.ecsino.homplus",DISPATCH_QUEUE_CONCURRENT);
    /**
     第二種拿系統的佇列
     第一個引數 優先順序
     第二個引數 預留給未來使用 隨便填0
     */
    dispatch_queue_t queue=  dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    
    dispatch_async(queue, ^{
       //執行緒內
        
        dispatch_async(dispatch_get_main_queue(), ^{
           //回到主執行緒
        });
        
    });
    
}


/**
 
 gcd柵欄函式
 會先執行柵欄函式前面的非同步任務
 然後執行柵欄函式
 再執行柵欄函式下面的非同步任務
 */
-(void)barrier{
    
    /**這裡的佇列必須用dispatch_queue_create建立的
     不能用系統的dispatch_get_global_queue
     否則不會生效*/
    dispatch_barrier_async(dispatch_queue_create("com.ecsino.homplus",DISPATCH_QUEUE_CONCURRENT), ^{
        
    });
    
}
/**gcd佇列組
 可以新增完成任務通知功能
 用於任務監聽
 */
-(void)group{
    //建立佇列
    dispatch_queue_t queue=dispatch_get_global_queue(0, 0);
    // 建立佇列組
    dispatch_group_t group=dispatch_group_create();
    //非同步函式
    dispatch_group_async(group, queue, ^{
        NSLog(@"非同步一");
    });
    dispatch_group_async(group, queue, ^{
        NSLog(@"非同步二");
    });
    dispatch_group_async(group, queue, ^{
        NSLog(@"非同步三");
    });
    


    //非同步等
    dispatch_group_notify(group, queue, ^{
          NSLog(@"全部任務完成通知");
    });
    //死等 任務不完成 後面程式碼不執行
    // dispatch_group_wait(group, DISPATCH_TIME_FOREVER);


}
/**gcd快速迭代*/
-(void)apply{
    
    /**
     快速迭代
     第一個引數遍歷的引數
     第二個引數佇列必須是併發佇列
     第三個引數 遍歷的索引*/
    dispatch_apply(10, dispatch_get_global_queue(0, 0), ^(size_t index) {
        
    });
    
}
/*
 第三種 執行緒
NSoperation
 */
-(void)operation{
    
    //第一種方式
//    NSInvocationOperation *operation=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(startOperaion) object:nil];
   //第二種方式
    NSBlockOperation *operation=[NSBlockOperation blockOperationWithBlock:^{
         //執行執行緒任務
        NSURL *url=[NSURL URLWithString:@"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1516809008589&di=f037ce52a7884e59ab83f0420e94a3c4&imgtype=0&src=http%3A%2F%2Fmvimg4.meitudata.com%2F5604ee3a30f7e560.jpg 


"];
       NSData *imageData= [NSData dataWithContentsOfURL:url];
       _image= [UIImage imageWithData:imageData];
       
    }];
    
    NSBlockOperation *operation1=[NSBlockOperation blockOperationWithBlock:^{
        //執行執行緒任務
    }];
    NSBlockOperation *operation2=[NSBlockOperation blockOperationWithBlock:^{
        //執行執行緒任務
    }];
    
    [operation addExecutionBlock:^{
        //可以追加任務
    }];
    operation.completionBlock = ^{
        //  完成監聽
        [[NSOperationQueue mainQueue]addOperationWithBlock:^{
            //主執行緒更新任務
            if(_image){
               // NSLog(@"主執行緒更新任務");
                 [_iv setImage:_image];
            }
           
        }];
    };
    
    //如果2新增依賴1 那麼執行完1才會執行2
    [operation2 addDependency:operation1];
    //如果operation1新增依賴operation 那麼執行完operation才會執行operation1
    [operation1 addDependency:operation];
    NSOperationQueue *queue=[[NSOperationQueue alloc]init];
    //設定最大併發數
   //   queue.maxConcurrentOperationCount=3;
    [queue addOperation:operation];
      [queue addOperation:operation1];
      [queue addOperation:operation2];


  // [queue setSuspended:YES];//暫停 NO可以恢復 不能暫停正在執行狀態的任務
   // [queue cancelAllOperations];//取消 不可以恢復
//
//    //簡便方法
//    [queue addOperationWithBlock:^{
//        //執行緒任務;
//    }];
    
    
}