美文网首页
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