一、NSOperation簡介
1.簡單說明
NSOperation的作⽤:配合使用NSOperation和NSOperationQueue也能實現多執行緒程式設計
NSOperation和NSOperationQueue實現多執行緒的具體步驟:
(1)先將需要執行的操作封裝到一個NSOperation物件中
(2)然後將NSOperation物件新增到NSOperationQueue中
(3)系統會⾃動將NSOperationQueue中的NSOperation取出來
(4)將取出的NSOperation封裝的操作放到⼀條新執行緒中執⾏
2.NSOperation的子類
NSOperation是個抽象類,並不具備封裝操作的能力,必須使⽤它的子類
使用NSOperation⼦類的方式有3種:
(1)NSInvocationOperation
(2)NSBlockOperation
(3)自定義子類繼承NSOperation,實現內部相應的⽅法
/*************************************************************/ //即預設情況下,如果操作沒有放到佇列中queue中,都是同步執行。只有將NSOperation放到一個NSOperationQueue中,才會非同步執行操作 NSLog(@"主執行緒---%@",[NSThread currentThread]); NSInvocationOperation *operation1=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test1) object:nil]; [operation1 start]; /*************************************************************/ //注意:只要NSBlockOperation封裝的運算元 > 1,就會非同步執行操作 NSBlockOperation *operation2=[NSBlockOperation blockOperationWithBlock:^{ for (int i=1; i<5; i++) { NSLog(@"NSBlockOperation1----%@",[NSThread currentThread]);} }]; [operation2 addExecutionBlock:^{ for (int i=1; i<5; i++) { NSLog(@"NSBlockOperation2----%@",[NSThread currentThread]);} }]; [operation2 addExecutionBlock:^{ for (int i=1; i<5; i++) { NSLog(@"NSBlockOperation3----%@",[NSThread currentThread]); } }]; //放入佇列後就不需要這句; [operation2 start]; /*************************************************************/ /*1)先將需要執行的操作封裝到一個NSOperation物件中 (2)然後將NSOperation物件新增到NSOperationQueue中 (3)系統會⾃動將NSOperationQueue中的NSOperation取出來 (4)將取出的NSOperation封裝的操作放到⼀條新執行緒中執⾏ */ NSInvocationOperation *operation3=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test3) object:nil]; NSInvocationOperation *operation4=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test4) object:nil]; NSOperationQueue *queue=[[NSOperationQueue alloc]init]; [queue addOperation:operation2]; [queue addOperation:operation3]; [queue addOperation:operation4];
/*************************************************************/ -(void)test1{ NSLog(@"operation1--test1---%@",[NSThread currentThread]); } -(void)test3{ for (int i=1; i<5; i++) { NSLog(@"NSOperationQueue-test3----%@",[NSThread currentThread]); } } -(void)test4{ for (int i=1; i<5; i++) { NSLog(@"NSOperationQueue--test4---%@",[NSThread currentThread]); } }