iOS-多線程之NSOperation,ios-nsoperation
- 前言
這篇文章主要講NSOperation的使用。
- What
使用NSOperation和NSOperationQueue進行多線程開發類似於線程池,只要將一個NSOperation(實際開發中需要使用其子類NSInvocationOperation、NSBlockOperation)放到NSOperationQueue這個隊列中線程就會依次啟動。NSOperationQueue負責管理、執行所有的NSOperation,在這個過程中可以更加容易管理線程總數和控制線程之間的依賴關係。
NSOperation 利用他來建立線程操作,線程操作只有放線上程隊列中才會在子線程中執行。
NSOperationQueue: 線程隊列分兩種類型。
- 主隊列
- [NSOperationQueue mainQueue]
- 凡是添加到主隊列中的任務(NSOperation),都會放到主線程中執行。
- 非主隊列
- [[NSOperationQueue alloc]init]
- 添加到這種隊列中的任務,都會放到子線程中執行。
NSOperation常用子類用於建立線程操作:NSInvocationOperation和NSBlockOperation,兩種方式本質沒有區別,但後者使用block形式進行程式碼群組織,使用相對方便。也可以用自訂的繼承於NSOperation的類來建立線程操作。
- How
配合使用NSOperation和NSOperationQueue實現多線程編程,一共有三種方式,但其實這三種方式都是採用NSOperation的子類與NSOperationQueue搭配實現多線程開發。這三個子類分別是NSInvocationOperation、NSBlockOperation和自訂繼承於NSOperation的類,前兩者是系統提供的子類。
方式一 NSInvocationOperation與NSOperationQueue搭配
方式二 NSBlockOperation與NSOperationQueue搭配,其實方式一和方式二沒有什麼本質區別。主要是後者使用block形式進行程式碼群組織,使用相對方便。
- (void)viewDidLoad{ [super viewDidLoad]; imageView = [[UIImageView alloc]initWithFrame:CGRectMake(50, 50, 200, 200)]; [self.view addSubview:imageView]; //1. 建立線程操作 NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"blockOperation線程操作所在的線程%@",[NSThread currentThread]); NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:kurl]]; [[NSOperationQueue mainQueue] addOperationWithBlock:^{ NSLog(@"更新UI所在的線程%@",[NSThread currentThread]); imageView.image = [UIImage imageWithData:data]; }]; }]; //2. 建立線程隊列 NSOperationQueue *operationQueue = [NSOperationQueue new]; //3. 將線程操作放到線程隊列中 [operationQueue addOperation:blockOperation]; //PS: 簡化以上操作 //1. 建立一個線程隊列 NSOperationQueue *operationQueue = [NSOperationQueue new]; //直接利用線程隊列的addOperationWithBlock添加線程操作。 [operationQueue addOperationWithBlock:^{ NSLog(@"更新UI所在的線程%@",[NSThread currentThread]); }];}
方式三 繼承於NSOperation的子類與NSOperationQueue的搭配
總結: 這三種方式中,感覺方式一是最麻煩的,方式二相對而已簡潔不少,而方式三更適合於封裝某一個線程操作。