標籤:
在ios中,使用多線程有三種方式,分別是:NSThread、NSOperation和NSOperationQueue、GCD,在本節,主要講解一下NSOperation的使用。
NSOperation和NSOperationQueue這種方式實際上是將NSOperation的對象放到一個NSOperationQueue隊列中,然後依次啟動操作,類似於線程池的使用。
在使用的過程中,NSOperation的操作使用的是它的子類,分別是NSInvocationOperation和NSBlockOperation,兩者沒有本質的區別,只不過後者以Block的方式來實現,使用相對簡單。NSOperationQueue主要負責管理和執行所有的NSOperation對象,並控制線程之間的執行順序與依賴關係。
下面,通過NSOperation開始多線程從網路擷取圖片並重新整理。
NSInvocationOperation
代碼
// ViewController.m// AAAAAA//// Created by jerei on 15-11-8.// Copyright (c) 2015年 jerehedu. All rights reserved.//#import "ViewController.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad];}#pragma mark - 點擊按鈕開啟線程下載圖片- (IBAction)click_InvocationOpreation_load:(UIButton *)sender { NSURL *url = [NSURL URLWithString:@"http://www.jerehedu.com/images/temp/logo.gif"]; //建立一個operation NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(loadImageWithUrl:) object:url]; //添加到操作隊列中 NSOperationQueue *queue = [[NSOperationQueue alloc] init]; [queue addOperation:operation];}#pragma mark - 根據url擷取圖片-(void)loadImageWithUrl:(NSURL *)url{ NSData *data = [NSData dataWithContentsOfURL:url]; UIImage *image = [UIImage imageWithData:data]; //回到主線程更新介面 NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(updateImageView:) object:image]; [[NSOperationQueue mainQueue] addOperation:operation];}#pragma mark - 更新介面-(void)updateImageView:(UIImage *)img{ _imageView.image = img;}@end
NSBlockOperation
代碼
// ViewController.m// AAAAAA//// Created by jerei on 15-11-8.// Copyright (c) 2015年 jerehedu. All rights reserved.//#import "ViewController.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad];}#pragma mark - 點擊按鈕開啟線程下載圖片- (IBAction)click_BlockOpreation_load:(UIButton *)sender { //建立操作隊列 NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init]; //設定最大並發線程數 operationQueue.maxConcurrentOperationCount = 5; //<方法一> 建立operation// NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{// //根據url請求資料// NSURL *url = [NSURL URLWithString:@"http://www.jerehedu.com/images/temp/logo.gif"];// [self loadImageWithUrl:url];// }];// // //添加到隊列中// [operationQueue addOperation:operation]; //<方法二> 建立operation [operationQueue addOperationWithBlock:^{ //根據url請求資料 NSURL *url = [NSURL URLWithString:@"http://www.jerehedu.com/images/temp/logo.gif"]; [self loadImageWithUrl:url]; }];}#pragma mark - 根據url擷取圖片-(void)loadImageWithUrl:(NSURL *)url{ NSData *data = [NSData dataWithContentsOfURL:url]; UIImage *image = [UIImage imageWithData:data]; //回到主線程更新介面 [[NSOperationQueue mainQueue] addOperationWithBlock:^{ [self updateImageView:image]; }];}#pragma mark - 更新介面-(void)updateImageView:(UIImage *)img{ _imageView.image = img;}@end
傑瑞教育
出處:http://www.cnblogs.com/jerehedu/
著作權聲明:本文著作權歸煙台傑瑞教育科技有限公司和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文串連,否則保留追究法律責任的權利。
技術諮詢:
iOS中的多線程 NSOperation