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)); 

     

  • 相关阅读:
    LFI、RFI、PHP封装协议安全问题学习
    Django:(博客系统)添加文章(中文)出现UnicodeEncodeError乱码
    Django:(博客系统)使用使用mysql数据->后台管理tag/post/category的配置
    Spark:性能调优
    Django:(博客系统)使用使用mysql数据&创建post/category/tag实体,并同步到数据中
    C#:多进程开发,控制进程数量
    Django通过pycharm创建后,如何登录admin后台?
    扑克牌游戏研究先告一段落
    Zookeeper通过java创建、查看、修改、删除znode
    ZooKeeper:win7上安装单机及伪分布式安装
  • 原文地址:https://www.cnblogs.com/dayihao/p/5634513.html
Copyright © 2011-2022 走看看