多线程的简单使用

作者: LeeDev | 来源:发表于2016-06-03 08:52 被阅读101次

    0.在进行多线程的时候我们初始化一些数据

    这里涉及到performSelectorOnMainThread 的操作

    - (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];
        
    }
    
    

    1.Thread的简单操作

    /********** 线程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 结束 ************/
    

    2.NSOperation 的操作

    设计到 线程的依赖的描述

    /********** 队列 操作 ************/
    
    - (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 的简单使用

    设计到 自定义的 串行队列和并发队列

    /****************** 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 结束 ******************/
    
    
    
    

    相关文章

      网友评论

        本文标题:多线程的简单使用

        本文链接:https://www.haomeiwen.com/subject/tkwkdttx.html