標籤:多線程
//// MyOperation.m// UI21_多線程//// Created by dllo on 15/8/26.// Copyright (c) 2015年 zhozhicheng. All rights reserved.//#import "MyOperation.h"@implementation MyOperation-(void)main{ NSInteger count = 1; for (NSInteger i = 0; i<600000000; i++) { count ++; } NSLog(@"%ld",count);}@end
//// ViewController.m// UI21_多線程//// Created by dllo on 15/8/26.// Copyright (c) 2015年 zhozhicheng. All rights reserved.//#import "ViewController.h"#import "MyOperation.h"#import "MBProgressHUD.h"#import "AFNetworking.h"@interface ViewController ()@property(nonatomic,retain)UIButton *button;@property(nonatomic,retain)UIImageView *imageView;@end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. self.button = [UIButton buttonWithType:UIButtonTypeSystem]; self.button.frame = CGRectMake(100, 100, 150, 50); [self.button setTitle:@"測試" forState:UIControlStateNormal]; self.button.layer.borderWidth = 1; self.button.layer.cornerRadius = 10; [self.view addSubview:self.button]; [self.button addTarget:self action:@selector(GCDAction:) forControlEvents:UIControlEventTouchUpInside]; self.imageView = [[UIImageView alloc] initWithFrame:CGRectMake(100, 200, 150, 150)]; self.imageView.backgroundColor = [UIColor cyanColor]; [self.view addSubview:self.imageView]; [_imageView release]; NSURL *url = [NSURL URLWithString:@"http://img4.duitang.com/uploads/item/201207/28/20120728105310_jvAjW.thumb.600_0.jpeg"]; NSData *data = [NSData dataWithContentsOfURL:url]; UIImage *image = [UIImage imageWithData:data]; self.imageView.image =image;// MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];// hud.labelText = @"正在下載....."; //設定樣式// hud.mode = MBProgressHUDModeDeterminate; //建立一個請求 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://help.adobe.com/archive/en/photoshop/cs6/photoshop_reference.pdf"]]; AFHTTPRequestOperation * operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; //指定一個檔案的儲存路徑,放到沙河的caches檔案裡 NSArray *sandBox = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); NSString *cachesPath =sandBox[0]; //拼接檔案路徑 NSString *pdfPath = [cachesPath stringByAppendingPathComponent:@"test.pdf"]; NSLog(@"%@",pdfPath); //把檔案下載到指定的檔案夾路徑內,寫成相應的檔案名稱 operation.outputStream = [NSOutputStream outputStreamToFileAtPath:pdfPath append:NO]; //通過AF進行下載 //這是下載進度的一個block,裡面會返回當前的下載進度,在這個block裡設定hud的進度顯示// [operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) {// hud.progress = (1.0) * (totalBytesRead) / totalBytesExpectedToRead;// }]; //當下載結束之後,控制進度的hud應該消失,所以我們通過af進行下載完成的進度判斷// [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {// NSLog(@"下載成功");// //移除hud// [hud removeFromSuperview];// } failure:^(AFHTTPRequestOperation *operation, NSError *error) {// NSLog(@"%@",error);// [hud removeFromSuperview];// }]; //把任務添加到隊列裡 NSOperationQueue *queue = [[NSOperationQueue alloc] init]; [queue addOperation:operation];}-(void)click:(UIButton *)button{ //線程卡死 NSInteger count = 0; for (NSInteger i = 0; i<100000; i++) { count++; NSLog(@"%ld",count); } NSLog(@"%ld",count);}#pragma mark 第一種解決線程問題的方法 NSObject提供的方法-(void)NSObjectThread:(UIButton *)button{ [self performSelectorInBackground:@selector(click:) withObject:button]; //優點:寫法特別簡單,能快速開闢一個臨時的線程 //缺點:不能保證線程使用時候的資料安全}#pragma mark 第二種方式 NSThread-(void)NSTHreadAction:(UIButton *)button{ //NSThread本身就是一個線程類,他可以控制線程休眠或者建立 //當前的主線程 NSLog(@"%@",[NSThread currentThread]); //主線程休眠三秒 [NSThread sleepForTimeInterval:3]; NSLog(@"111111"); //如果用NSThread建立對象,建立出來的就是新的線程 NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(click:) object:nil]; //可以給新的線程對象起名 thread.name = @"zhangyangyang"; //啟動子線程 [thread start]; //優點:可以直接通過建立方式來控制線程 //缺點:什麼都需要手動設定,包括名,開始,太麻煩}#pragma mark 第三種 NSOperation 任務-(void)operationAtion:(UIButton *)button{// NSOperation是一個抽象類別,如果想使用這個抽象類別,必須要建立一個他的子類 MyOperation *operation = [[MyOperation alloc] init]; [operation start]; //他不能單獨拿出來使用,如果單獨使用和之前不考慮線程方式是一樣的會卡死主線程,他一般和MyOperationQueue配合使用}-(void)operationQueue:(UIButton *)button{ //預設和任務一起配合使用解決多線程問題 //隊列:隊列中通過一個線程池來管理所有閑置的線程,這樣可以提高線程的重用利用率,避免重複建立線程,整合資源 //優點:內部不需要關心線程的安全問題,用起來相對簡單 //缺點:效率稍微有點低 NSOperationQueue *queue = [[NSOperationQueue alloc] init]; //設定最大並發數 [queue setMaxConcurrentOperationCount:2]; MyOperation *op1 = [[MyOperation alloc] init]; MyOperation *op2 = [[MyOperation alloc] init]; MyOperation *op3 = [[MyOperation alloc] init]; MyOperation *op4 = [[MyOperation alloc] init]; MyOperation *op5 = [[MyOperation alloc] init]; //把任務加到隊列 [queue addOperation:op1]; [queue addOperation:op2]; [queue addOperation:op3]; [queue addOperation:op4]; [queue addOperation:op5];}-(void)GCDAction:(UIButton *)button{// //GCD是蘋果提供的一種處理多線程的解決方案,整體比較好,和operationQueue兩種是常見的解決線程問題的方法// //這個方法可以保證無論哪個線程執行都只執行一次// static dispatch_once_t oneToKen;// dispatch_once(&oneToKen, ^{// // });// //自訂一個隊列// //第一個參數:給隊列起一個名(C語言字串,不加@) 第二個參數:設定隊列並行// //DISPATCH_QUEUE_CONCURRENT並行隊列// dispatch_queue_t myQueue = dispatch_queue_create("zhangyangyang", DISPATCH_QUEUE_CONCURRENT);// //接下來,可以在隊列執行一些任務// dispatch_async(myQueue, ^{// NSInteger count = 0;// for (NSInteger i = 0; i<60000; i++) {// count++;// }// NSLog(@"%ld",count);// }); //////// //網路請求一般會在子線程裡進行載入,但是顯示這個資料都在主線程裡進行,所以需要把請求的資料放到主線程使用 //定義一個全域的隊列 //第一個參數:設定當前隊列優先 //第二個參數:沒有實際含義,留給以後用 dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); //再擷取一下當前的主隊列,也就是主線程 dispatch_queue_t mainQueue = dispatch_get_main_queue(); //通過非同步進行資料請求 dispatch_async(globalQueue, ^{ //通過網址請求圖片資料 NSString *picStr = @"http://img4.duitang.com/uploads/item/201207/28/20120728105310_jvAjW.thumb.600_0.jpeg"; NSURL *url =[NSURL URLWithString:picStr]; NSData *data = [NSData dataWithContentsOfURL:url]; UIImage *image = [UIImage imageWithData:data]; //把請求下來的資料到主線程進行重新整理 dispatch_async(mainQueue, ^{ self.imageView.image = image; }); });}- (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated.}@end
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
iOS UI21_多線程