多线程的简单使用

来源:互联网 发布:帝国cms newstxt修改 编辑:程序博客网 时间:2024/05/20 04:10
////  ViewController.m//  多线程处理////  Created by apple on 16/6/2.//  Copyright © 2016年 李重阳. All rights reserved.//#import "ViewController.h"static NSInteger const AddTag = 100;@interface ViewController ()@property (nonatomic,strong) UIImageView * imageView;@property (nonatomic,strong) NSArray * urlArr;@end@implementation ViewController- (void)viewDidLoad {    [super viewDidLoad];    self.urlArr = @[@"http://weixue.steptowin.com:8000/data/img/20160411/veuyytthy4b2_320_200.jpg",                         @"http://weixue.steptowin.com:8000/data/img/20160528/qcxt7ow9syjo.png",                         @"http://weixue.steptowin.com:8000/data/img/20160527/zeol7j6gsto9.png",                         @"http://weixue.steptowin.com:8000/data/img/20160413/wag5q4elonh4_320_200.jpg",                         @"http://weixue.steptowin.com:8000/data/img/20160411/veuyytthy4b2_320_200.jpg",                         @"http://weixue.steptowin.com:8000/data/img/20160528/qcxt7ow9syjo.png",                         @"http://weixue.steptowin.com:8000/data/img/20160527/zeol7j6gsto9.png",                         @"http://weixue.steptowin.com:8000/data/img/20160413/wag5q4elonh4_320_200.jpg",                         @"http://weixue.steptowin.com:8000/data/img/20160411/veuyytthy4b2_320_200.jpg",                         @"http://weixue.steptowin.com:8000/data/img/20160528/qcxt7ow9syjo.png",                         @"http://weixue.steptowin.com:8000/data/img/20160527/zeol7j6gsto9.png",                         @"http://weixue.steptowin.com:8000/data/img/20160413/wag5q4elonh4_320_200.jpg"];    /*简单线程**/    //[self thread];    /* 队列操作**/    //[self operation];    /*GCD**/    [self GCD];}/********** 线程Thread 操作 ************/- (void)thread {    _imageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 100, 100)];    [self.view addSubview:_imageView];    UIButton *button=[UIButton buttonWithType:UIButtonTypeRoundedRect];    button.frame=CGRectMake(50, 500, 220, 25);    [button setTitle:@"加载图片" forState:UIControlStateNormal];    //添加方法    [button addTarget:self action:@selector(threadClick) forControlEvents:UIControlEventTouchUpInside];    [self.view addSubview:button];}- (void)threadClick {    [NSThread detachNewThreadSelector:@selector(threadRun) toTarget:self withObject:nil];}- (void)threadRun {    NSLog(@"callMainbefore_1");    NSURL *url=[NSURL URLWithString:self.urlArr.firstObject];    NSData *data=[NSData dataWithContentsOfURL:url];    NSLog(@"callMainbefore_2");    /*     直到 updateUI: 做完了 是否才开始往下操作     waitUntilDone:NO     2016-06-02 17:13:47.618 多线程处理[10042:208753] callMainbefore_1     2016-06-02 17:13:47.673 多线程处理[10042:208753] callMainbefore_2     2016-06-02 17:13:47.674 多线程处理[10042:208753] callMainAfter     2016-06-02 17:13:52.675 多线程处理[10042:208668] callMain     waitUntilDone:YES     2016-06-02 17:16:05.525 多线程处理[10062:210446] callMainbefore_1     2016-06-02 17:16:05.607 多线程处理[10062:210446] callMainbefore_2     2016-06-02 17:16:10.609 多线程处理[10062:210347] callMain     2016-06-02 17:16:10.613 多线程处理[10062:210446] callMainAfter     **/    [self performSelectorOnMainThread:@selector(updateUI:) withObject:data waitUntilDone:YES];    NSLog(@"callMainAfter");}- (void)updateUI:(NSData *)imageData {    sleep(5);    NSLog(@"callMain");    self.imageView.image = [UIImage imageWithData:imageData];}/********** 线程Thread 结束 ************//********** 队列 操作 ************/- (void)operation {    CGFloat space = 10;    CGFloat imageWH = (320 - 10*5)/4.0;    for (NSInteger i = 0 ; i < self.urlArr.count; i++) {        UIImageView * imageView = [[UIImageView alloc]init];        [self.view addSubview:imageView];        imageView.frame = CGRectMake(space +(space+imageWH)*(i%4), space +(space+imageWH)*(i/4), imageWH, imageWH);        imageView.tag = AddTag + i;    }    UIButton *button=[UIButton buttonWithType:UIButtonTypeRoundedRect];    button.frame=CGRectMake(50, 500, 220, 25);    [button setTitle:@"加载图片" forState:UIControlStateNormal];    [button addTarget:self action:@selector(operationClick) forControlEvents:UIControlEventTouchUpInside];    [self.view addSubview:button];}- (void)operationClick {    NSOperationQueue * queue = [[NSOperationQueue alloc]init];    queue.maxConcurrentOperationCount = 2;    __weak typeof(self)weakSelf = self;    for (NSInteger i = 0 ; i < self.urlArr.count; i++) {        UIImageView * imageView = [self.view viewWithTag:AddTag+i];        imageView.image = nil;        NSBlockOperation * blockOp = [NSBlockOperation blockOperationWithBlock:^{            NSURL *url=[NSURL URLWithString:weakSelf.urlArr[i]];            NSData *data=[NSData dataWithContentsOfURL:url];            dispatch_async(dispatch_get_main_queue(), ^{                //更新UI 需要主线程                imageView.image = [UIImage imageWithData:data];            });        }];        if (i >0) {            /* 就是 依赖前面的**/            NSBlockOperation * preOperation = queue.operations[i-1];            [blockOp addDependency:preOperation];        }        [queue addOperation:blockOp];    }}/********** 队列 操作结束 ************//****************** GCD ******************/- (void)GCD {    CGFloat space = 10;    CGFloat imageWH = (320 - 10*5)/4.0;    for (NSInteger i = 0 ; i < self.urlArr.count; i++) {        UIImageView * imageView = [[UIImageView alloc]init];        [self.view addSubview:imageView];        imageView.frame = CGRectMake(space +(space+imageWH)*(i%4), space +(space+imageWH)*(i/4), imageWH, imageWH);        imageView.tag = AddTag + i;    }    UIButton *button=[UIButton buttonWithType:UIButtonTypeRoundedRect];    button.frame=CGRectMake(50, 500, 220, 25);    [button setTitle:@"加载图片" forState:UIControlStateNormal];    //添加方法    [button addTarget:self action:@selector(GCDClick) forControlEvents:UIControlEventTouchUpInside];    [self.view addSubview:button];}/* 串行执行**/- (void)GCDClick {    __weak typeof(self)weakSelf = self;    dispatch_queue_t serialQueue = dispatch_queue_create("LeeGCDQueue", DISPATCH_QUEUE_SERIAL);    for (NSInteger i = 0 ; i < self.urlArr.count; i++) {        UIImageView * imageView = [self.view viewWithTag:AddTag+i];        imageView.image = nil;        dispatch_async(serialQueue, ^{            NSURL *url=[NSURL URLWithString:weakSelf.urlArr[i]];            NSData *data=[NSData dataWithContentsOfURL:url];            dispatch_async(dispatch_get_main_queue(), ^{                //更新UI 需要主线程                imageView.image = [UIImage imageWithData:data];            });        });    }}///* 并发执行**///- (void)GCDClick {//    //    __weak typeof(self)weakSelf = self;//    dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);//    for (NSInteger i = 0 ; i < self.urlArr.count; i++) {//        UIImageView * imageView = [self.view viewWithTag:AddTag+i];//        imageView.image = nil;//        dispatch_async(globalQueue, ^{//            //            NSURL *url=[NSURL URLWithString:weakSelf.urlArr[i]];//            NSData *data=[NSData dataWithContentsOfURL:url];//            dispatch_async(dispatch_get_main_queue(), ^{//                //                //更新UI 需要主线程//                imageView.image = [UIImage imageWithData:data];//            });//            //            //        });//        //    }//    //}/****************** GCD 结束 ******************/@end
0 0
原创粉丝点击