设为首页 加入收藏

TOP

iOS进阶学习-多线程(二)
2017-10-13 10:33:08 】 浏览:4197
Tags:iOS 进阶 学习 线程
要自动为Operation开辟合适数量的线程,以完成任务的并行执行。
  • 其中NSOperation可以调节它在队列中的优先级(使用addDependency:设置依赖关系)。
  • 当最大并发数设置为1的时候,能实现线程同步(串行执行)。
  •     // 创建队列的对象
        NSOperationQueue *queue = [[NSOperationQueue alloc] init];
        // 当值设置为1的时候,可以叫做串行:即顺序执行
        // 当设置大于1的时候,叫做并行:多条通道同时进行各自的任务
        queue.maxConcurrentOperationCount = 2;
        
        for (int i= 0; i < 10; i++) {
            NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{
                NSLog(@"current = %@, da = %@, i = %d", [NSThread currentThread], [NSThread mainThread], i);
            }];
            [queue addOperation:blockOperation];
        }

    四、GCD

      1、GCD简介

    • Grand Central Dispatch (GCD)是Apple开发的一种多核编程技术。主要用于优化应用程序以支持多核处理器以及其他对称多处理系统。
    • GCD提供函数实现多线程开发,性能更高,功能也更加强大。
    • 它首次发布在Mac OS X 10.6 ,iOS 4及以上也可用。

      2、GCD核心概念

    • 任务:具有一定功能的代码段。一般是一个block或者函数。
    • 分发队列:GCD以队列的方式进行工作,FIFO。
    • GCD会根据分发队列的类型,创建合适数量的线程执行队列中的任务。

      3、GCD中两种队列(dispatch queue

    • SerialQueue:一次只执行一个任务。Serial queue通常用于同步访问特定的资源或数据。当你创建多个Serial queue时,虽然它们各自是同步执行的,但Serial queue与Serial queue之间是并发执行的。SerialQueue能实现线程同步。
    #pragma mark - 使用GCD去创建一个串行队列
        // 第一种:系统提供的创建串行队列的方法
         dispatch_queue_t queue = dispatch_get_main_queue();//在真正的开发中如果需要创建串行队列,比较习惯用这种
        // 第二种:自己创建
        // 参数1:系统提供的一个宏
        // 参数2:是系统的保留字段
        // 参数1和2可以互换位置,位置没有严格要求
        dispatch_queue_t queue = dispatch_queue_create(DISPATCH_QUEUE_SERIAL, 0); 
    • Concurrent:可以并发地执行多个任务,但是遵守FIFO
    #pragma mark - 使用GCD去创建一个并行队列
        // 第一种:系统提供的
        // 参数1:优先级(有四个,没有明显的区别DISPATCH_QUEUE_PRIORITY_DEFAUL,    DISPATCH_QUEUE_PRIORITY_HIGH,    DISPATCH_QUEUE_PRIORITY_LOW,  DISPATCH_QUEUE_PRIORITY_BACKGROUND
    // 参数2:系统的保留字段
        dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
        // 第二种:自己创建
        // 参数1:表示创建队列的名字(苹果推荐使用反向域名去命名)
        // 参数2:系统提供的一个宏(队列的类型)
        dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);
    

      4、GCD功能

    • dispatch_async()    //往队列中添加任务,任务会排队执行
    • dispatch_after()      //往队列中添加任务,任务不但会排队,还会在延迟的时间点执行
    • dispatch_apply()    //往队列中添加任务,任务会重复执行n次
    dispatch_async(queue, ^{
            NSLog(@"currentThread = %@", [NSThread currentThread]);
            NSLog(@"mainThread = %@", [NSThread mainThread]);
        });
    
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            NSLog(@"3.0秒之后输出");
        });
    
    dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);
        dispatch_apply(10, queue, ^(size_t index) {
            NSLog(@"%ld", index);
        });
    • dispatch_group_async()   //将任务添加到队列中,并添加分组标记
    • dispatch_group_notify()    //将任务添加到队列中,当某个分组的所有任务执行完之后,此任务才会执行
    • dispatch_barrier_async()  //将任务添加到队列中,此任务执行的时候,其他任务停止执行
        // 创建一个分组
        dispatch_group_t group = dispatch_group_create();
        // 创建一个并行队列
        dispatch_queue_t queue = dispatch_queue_create(0, DISPATCH_QUEUE_CONCURRENT);
        dispatch_group_async(group, queue, ^{
            NSLog(@"我是任务1");
        });
        dispatch_group_async(group, queue, ^{
            NSLog(@"我是任务2");
        });
        dispatch_group_async(group, queue, ^{
            NSLog(@"我是任务3");
        });
        
        // 用于监听所有任务的执行情况的(所以此功能代码必须放在所有任务之后书写)
        dispatch_group_notify(group, queue, ^{
            NSLog(@"我是在所有任务之
    首页 上一页 1 2 3 下一页 尾页 2/3/3
    】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
    上一篇UIWebView加载本地html文件 下一篇【代码笔记】iOS-清除图片缓存UIA..

    最新文章

    热门文章

    Hot 文章

    Python

    C 语言

    C++基础

    大数据基础

    linux编程基础

    C/C++面试题目