iOS UI21_多線程

來源:互聯網
上載者:User

標籤:多線程

////  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_多線程

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.