美文网首页iOS 多线程开发
多线程一《NSThread开发》

多线程一《NSThread开发》

作者: baiwulong | 来源:发表于2017-12-21 12:55 被阅读3次

    推荐前往

    (原文)iOS开发系列--并行开发其实很容易

    NSThread常用方法

    +(void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(id)argument;类方法-开辟线程
    -(instancetype)initWithTarget:(id)target selector:(SEL)selector object:(id)argument;对象方法-开辟线程
    -(void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;主线程-将数据显示到UI控件,注意只能在主线程中更新UI【参数:@waitUntilDone:是否线程任务完成执行】

    [NSThread currentThread]; 获取当前线程
    thread.threadPriority=1.0; 设置优先级(0~1)值越大,优先级越大
    thread . name =@"name"; 设置线程名称

    扩展--NSObject分类扩展方法

    为了简化多线程开发过程,苹果官方对NSObject进行分类扩展(本质还是创建NSThread),对于简单的多线程操作可以直接使用这些扩展方法。

    - (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg:在后台执行一个操作,本质就是重新创建一个线程执行当前方法。
    - (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait:在指定的线程上执行一个方法,需要用户创建一个线程对象。
    - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait:在主线程上执行一个方法(前面已经使用过)。
    

    NSThread多线程下载图片

    解决线程阻塞问题 - 代码:

    #pragma mark 多线程下载图片
    -(void)loadImageWithMultiThread{
        //方法1:使用对象方法
        //创建一个线程,第一个参数是请求的操作,第二个参数是操作方法的参数
        //    NSThread *thread=[[NSThread alloc]initWithTarget:self selector:@selector(loadImage) object:nil];
        //    //启动一个线程,注意启动一个线程并非就一定立即执行,而是处于就绪状态,当系统调度时才真正执行
        //    [thread start];
        
        //方法2:使用类方法
        [NSThread detachNewThreadSelector:@selector(loadImage) toTarget:self withObject:nil];
    }
    #pragma mark 加载图片
    -(void)loadImage{
        //请求数据
        NSURL *url=[NSURL URLWithString:@"https://www.baidu.com/img/bd_logo1.png"];
        NSData *data=[NSData dataWithContentsOfURL:url];
    
      /*将数据显示到UI控件,注意只能在主线程中更新UI,
         另外performSelectorOnMainThread方法是NSObject的分类方法,每个NSObject对象都有此方法,
         它调用的selector方法是当前调用控件的方法,例如使用UIImageView调用的时候selector就是UIImageView的方法
         Object:代表调用方法的参数,不过只能传递一个参数(如果有多个参数请使用对象进行封装)
         waitUntilDone:是否线程任务完成执行
        */
        [self performSelectorOnMainThread:@selector(updateImage:) withObject:data waitUntilDone:YES];
    }
    
    #pragma mark 将图片显示到界面
    -(void)updateImage:(NSData *)imageData{
        UIImage *image=[UIImage imageWithData:imageData];
        _imageView.image=image;
    }
    

    并发下载多张图片

       //创建多个线程用于填充图片
        for (int i=0; i<ROW_COUNT*COLUMN_COUNT; ++i) {
            //        [NSThread detachNewThreadSelector:@selector(loadImage:) toTarget:self withObject:[NSNumber numberWithInt:i]];
            NSThread *thread=[[NSThread alloc]initWithTarget:self selector:@selector(loadImage:) object:[NSNumber numberWithInt:i]];
            thread.name=[NSString stringWithFormat:@"myThread%i",i];//设置线程名称
            [thread start];
        }
    

    或者设置优先级

        NSMutableArray *threads=[NSMutableArray array];
        int count=ROW_COUNT*COLUMN_COUNT;
        //创建多个线程用于填充图片
        for (int i=0; i<count; ++i) {
            //        [NSThread detachNewThreadSelector:@selector(loadImage:) toTarget:self withObject:[NSNumber numberWithInt:i]];
            NSThread *thread=[[NSThread alloc]initWithTarget:self selector:@selector(loadImage:) object:[NSNumber numberWithInt:i]];
            thread.name=[NSString stringWithFormat:@"myThread%i",i];//设置线程名称
            if(i==(count-1)){
                thread.threadPriority=1.0;
            }else{
                thread.threadPriority=0.0;
            }
            [threads addObject:thread];
        }
        for (int i=0; i<count; i++) {
            NSThread *thread=threads[i];
            [thread start];
        }
    

    或者系统快速创建线程

     int count=ROW_COUNT*COLUMN_COUNT;
     for (int i=0; i<count; ++i) {
            [self performSelectorInBackground:@selector(loadImage:) withObject:[NSNumber numberWithInt:i]];
        }
    

    相关文章

      网友评论

        本文标题:多线程一《NSThread开发》

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