美文网首页
iOS之多线程(Multiple threads)小结1.0

iOS之多线程(Multiple threads)小结1.0

作者: 牛程程 | 来源:发表于2017-12-13 23:20 被阅读0次

    在iOS操作系统中,每一个进程都会有且只有一个主线程,也把这个线程叫做UI线程。UI的刷新都是在主线程中进行的。同时,一个进程可以很多个其它的线程,主线程是这些线程的父线程。子线程一般都是独立于Cocoa Touch。所以,在下载图片资源、播放音频、处理图片等操作时,通常都是在子线程中进行的。
    多线程的优点:
    -多线程可以提高应用程序的感知响应能力。
    -多线程可以提高应用程序在多核系统上的实时性。

    iOS常用的多线程开发有三种方式:

    1. NSThread
    //使用对象方法,第一个参数是需要执行的方法,第二个参数是方法的参数
        NSThread *thread=[[NSThread alloc]initWithTarget:self selector:@selector(方法名) object:nil];
    //新创建的线程处于就绪状态,当系统调度的时候,才是真正执行。
        [thread start];
        
    //使用类方法
        [NSThread detachNewThreadSelector:@selector(方法名) toTarget:self withObject:nil];
    
    //使用主线程执行方法
    [self performSelectorOnMainThread:@selector(刷新UI的方法名) withObject:imageData waitUntilDone:YES];
    
    1. NSOperation
      NSOperation是一个抽象类,它有三个子类:NSBlockOperation、NSInvocationOperation以及自定义继承自NSOperation的类。
    NSInvocationOperation *operation = [[NSInvocationOperation alloc]
                                            initWithTarget:self selector:@selector(方法名) object:nil];
    [operation start];
    NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^
    {
        }];
        [operation addExecutionBlock:^{
        }];
    [operation start];
    
     //子线程下载图片
        NSOperationQueue *queue = [[NSOperationQueue alloc]init];
    
        [queue addOperationWithBlock:^{
            NSURL *url = [NSURL URLWithString:urlString];
            NSData *data = [NSData dataWithContentsOfURL:url];
            UIImage *image = [UIImage imageWithData:data];
    
            //主线程刷新UI
            [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                self.imageView.image = image;
            }];
        }];
    
    1. GCD
     dispatch_async(dispatch_get_global_queue(0, 0), ^{
     });
    
     dispatch_async(dispatch_get_main_queue(), ^{
     });
    
     static dispatch_once_t onceToken;
     dispatch_once(&onceToken, ^{
     });
    
     double delayInSeconds = 1.0;
     dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
     dispatch_after(time, dispatch_get_main_queue(), ^(void){
     });
    
     // 自定义dispatch_queue_t
     dispatch_queue_t custom_queue = dispatch_queue_create("customQueue", NULL);
     dispatch_async(custom_queue, ^{  
     });
     dispatch_release(urls_queue);
    
    //异步下载图片
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{  
        NSURL *url = [NSURL URLWithString:urlStr];  
        UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:url]];  
          
        //主线程刷新UI
        dispatch_async(dispatch_get_main_queue(), ^{  
            self.imageView.image = image;  
        });  
    });  
    

    相关文章

      网友评论

          本文标题:iOS之多线程(Multiple threads)小结1.0

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