zoukankan      html  css  js  c++  java
  • iOS进阶之多线程

    多线程

    注意:iOS关于UI的刷新和添加必须在主线程中操作!

    pthread的创建方法:

        pthread_t pthread;
        
        //第一个参数 线程指针
        //第二个参数 线程的一些属性
        //第三个参数 函数指针 用于执行方法
        //第四个参数 线程中的传值
        pthread_create(&pthread, NULL, run, NULL);

    当应用程序刚运行的时候, 系统会自动为我们开放一个线程,该线程为主线程.

    子线程是程序员用代码手动开启的线程,它存在的意义是为了执行耗时操作的任务.

    一、NSThread的创建方法:

    1.

        NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(haoshicaozuo) object:@"123"];
        thread.name = @"123";
        //开启线程
        [thread start];

    2.快捷创建

    [NSThread detachNewThreadSelector:@selector(haoshicaozuo) toTarget:self withObject:@"456"];
    [self performSelectorInBackground:@selector(haoshicaozuo) withObject:@"123"];

    下面一行代码指的是睡眠时间, 根据特定需求修改时长.

    [NSThread sleepForTimeInterval:0.5];

    二、NSOperation

    NSOperation是一个抽象类,我们一般不直接使用它,而是使用它的子类NSInvocationOperation和NSBlockOperation,如果他们单独使用都是在主线程执行,只有和队列放在一起使用时在子线程执行.

    NSInvocationOperation *operation1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(operationAction1) object:nil];
    //    [operation1 start];
        NSInvocationOperation *operation2 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(operationAction2) object:nil];
        NSBlockOperation *operation3 = [NSBlockOperation blockOperationWithBlock:^{
            for (int i = 20; i < 30; i++) {
                NSLog(@"%d", i);
            }
        }];
        //加入到队列
        //mainQueue代表着主队列
    //    NSOperationQueue *queue = [NSOperationQueue mainQueue];
        
        //如果是alloc init 那就代表着其他对列
        //先加的先执行,后加的后执行, 但是执行的时间不一定, 可能后执行的比先执行的先执行完
        NSOperationQueue *queue = [[NSOperationQueue alloc] init];
        [queue addOperation:operation1];
        [queue addOperation:operation2];
        [queue addOperation:operation3];

    三、GCD

    异步: 不在一个线程执行

    同步: 在同一个线程执行 

    串行: 串在一起执行

    并行: 一起执行

    同步 + 主队列   :所有通过GCD提交到主队列的任务必须是异步的, 否则会造成死锁

    异步 + 主队列 : 不开辟线程, 就在主线程执行 (主队列就是串行的)

    同步 + 串行对列: 不具备开启线程的能力, 在当前线程完成任务

    异步 + 串行      :具备开启线程的能力, 但是任务是串行的,执行完一个才会去执行下一个

    同步 + 并行队列 : 不具备开启线程的能力,并发的功能也就没用了

      并行队列的两种创建方式:

    dispatch_queue_t queue = dispatch_queue_create("sb.2b.com", DISPATCH_QUEUE_CONCURRENT);
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    异步 + 并发队列

    三(一):GCD网络请求:

    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        
        dispatch_queue_t queue = dispatch_queue_create("aaa", DISPATCH_QUEUE_CONCURRENT);
        dispatch_async(queue, ^{
            NSURL *url = [NSURL URLWithString:@"https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=100&size=b4000_4000&sec=1464140268&di=6b6b2e3ea5da34b7da1e02fd28c7acd2&src=http://pic36.nipic.com/20131115/12106414_153522431000_2.jpg"];
            NSData *data = [NSData dataWithContentsOfURL:url];
            dispatch_sync(dispatch_get_main_queue(), ^{
                self.myImageView.image = [UIImage imageWithData:data];
            });
        });
        
    }

    三(二):GCD函数的使用:

    延迟执行block

    void dispatch_after(dispatch_time_t when, dispatch_queue_t queue, dispatch_block_t block); 

    重复执行block,需要注意的是这个方法是同步返回,也就是说等到所有block执行完毕才返回,如需异步返回则嵌套在dispatch_async中来使用。多个block的运行是否并发或串行执行也依赖queue的是否并发或串行。

    void dispatch_apply(size_t iterations, dispatch_queue_t queue, void (^block)(size_t)); 

     

  • 相关阅读:
    【Nginx】ngx_event_core_module模块
    ELMAH--Using HTTP Modules and Handlers to Create Pluggable ASP.NET Components 77 out of 90 rated th
    nyist oj 214 单调递增子序列(二) (动态规划经典)
    java 入门书籍(java7)
    ARCGIS将WGS84坐标投影到高斯平面
    【linux】linux下对java程序生成dump文件,并使用IBM Heap Analyzer进行分析,查找定位内存泄漏的问题代码
    【springboot】【socket】spring boot整合socket,实现服务器端两种消息推送
    【linux】linux修改open file 大小
    【docker】docker限制日志文件大小的方法+查看日志文件的方法
    【docker】docker部署spring boot服务,但是docker logs查看容器输出控制台日志,没有日志打印,日志未打印,docker logs不打印容器日志
  • 原文地址:https://www.cnblogs.com/dayihao/p/5634513.html
Copyright © 2011-2022 走看看