zoukankan      html  css  js  c++  java
  • iOS线程开发小结

    在iOS开发线程操作时,一般方法名决定是否开启新线程(async,sync),队列类型(全局队列,串行队列)决定开启多少条线程

     1.快速线程调用

     *开启后台线程执行任务

     [self performSelectorInBackground:@selector(test) withObject:nil];

     *回到主线程执行任务

     [self performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:YES];

     2.GCD : 依赖队列执行

     1> 队列类型

     * 全局队列

     * 所有添加到全局队列中的任务都是并发执行(同时执行,可能会开启多个线程)

     * dispatch_get_global_queue

     * 串行队列

     * 所有添加到串行队列中的任务都是按顺序执行(开一条线程)

     * dispatch_queue_create("myqueue", 0);

     * 主队列

     * 所有添加到主队列中的任务都是在主线程中执行的(跟方法名没有关系)

     * dispatch_get_main_queue

     2> 同步还是异步,取决于方法名(不影响主队列,影响全局队列、串行队列)

     * 同步:dispatch_sync,在当前线程执行任务,不会开启新的线程

     * 异步:dispatch_async,在其他线程执行任务,会开启新的线程

     3.NSOperationNSOperationQueue

     1> 使用步骤

     * 创建NSOperation

     * 添加NSOperation到NSOperationQueue

     2> 优点

     * 更加面向对象

     * 可以控制最大并发数  maxConcurrentOperationCount

     * 添加任务(Operation)之间的依赖 addDependency

     */

    #import "XMQViewController.h"

    @interface XMQViewController ()

    {

        NSOperationQueue *_queue;

    }

    @end

    @implementation XMQViewController

    - (void)viewDidLoad

    {

        [super viewDidLoad];

        

        _queue = [[NSOperationQueue alloc] init];

        // 控制最大并发数,最多同时执行3条线程

        _queue.maxConcurrentOperationCount = 3;

        

        // 回到主线程

    //    [self test];

        

        // 线程监听

    //    [self gcd_group];

        

        // GCD线程依赖

    //    [self gcd_barrier];

        

        // 循环执行

        [self gcd_apply];

        // 全局队列

        dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

        // 串行队列

    //    dispatch_queue_t queue2 = dispatch_queue_create("myqueue", 0);

        

        dispatch_async(queue, ^{ // 耗时操作

            NSLog(@"这是一个异步线程---%@", [NSThread currentThread]);

        });

    }

    - (IBAction)click

    {

        NSOperation *operation = [NSBlockOperation blockOperationWithBlock:^{

            NSLog(@"operation---%@", [NSThread currentThread]);

        }];

        

        NSOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{

            NSLog(@"operation2---%@", [NSThread currentThread]);

        }];

        

        // 该方法默认在主线程执行

    //    [operation start];

        

        // 加入队列会在异步线程执行

        [_queue addOperation:operation];

        [_queue addOperation:operation2];

        

        // 设置线程依赖 (operation2依赖于operation,operation执行完以后,才能执行operation2)

        [operation addDependency:operation2];

    }

    // 延时执行某条线程

    - (IBAction)click2

    {

        // 全局队列

    //    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

        // 串行队列

        dispatch_queue_t queue2 = dispatch_queue_create("myqueue", 0);

        double delayInSeconds = 5.0;

        dispatch_time_t delayInNanoSeconds =dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);

        dispatch_after(delayInNanoSeconds, queue2, ^{

            NSLog(@"延迟执行");

        });

    }

    // dispatch_group_async(异步方法)可以实现监听一组任务是否完成,完成后得到通知执行其他的操作(比如通知用户下载完成,显示UI等)

    - (void)gcd_group

    {

        dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

        dispatch_group_t group = dispatch_group_create();

        

        dispatch_group_async(group, queue, ^{

            [NSThread sleepForTimeInterval:1];

            NSLog(@"group1");

        });

        dispatch_group_async(group, queue, ^{

            [NSThread sleepForTimeInterval:2];

            NSLog(@"group2");

        });

        dispatch_group_async(group, queue, ^{

            [NSThread sleepForTimeInterval:3];

            NSLog(@"group3");

        });

        dispatch_group_notify(group, dispatch_get_main_queue(), ^{

            NSLog(@"updateUI");

        });

    }

    // dispatch_barrier_async 是在前面的任务执行结束后才执行,而且后面的任务必须等它执行完成之后才会执行

    - (void)gcd_barrier

    {

        dispatch_queue_t queue = dispatch_queue_create("myqueue", DISPATCH_QUEUE_CONCURRENT);

        dispatch_async(queue, ^{

            [NSThread sleepForTimeInterval:2];

            NSLog(@"dispatch_async1");

        });

        dispatch_async(queue, ^{

            [NSThread sleepForTimeInterval:4];

            NSLog(@"dispatch_async2");

        });

        dispatch_barrier_async(queue, ^{

            NSLog(@"dispatch_barrier_async");

            [NSThread sleepForTimeInterval:4];

        });

        dispatch_async(queue, ^{

            [NSThread sleepForTimeInterval:2];

            NSLog(@"dispatch_async3");

        });

    }

    // dispatch_apply 执行某个代码片段N次

    - (void)gcd_apply

    {

        dispatch_queue_t queue = dispatch_queue_create("myqueue", DISPATCH_QUEUE_PRIORITY_DEFAULT);

        dispatch_apply(10, queue, ^(size_t index) {

            NSLog(@"循环执行10次");

        });

    }

    // 回到主线程

    - (void)test

    {

        UIImage *image = nil;

        [self performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:YES]; 

        dispatch_async(dispatch_get_main_queue(), ^{

            NSLog(@"更新UI界面---%@", [NSThread currentThread]);

        });

    }

    @end

  • 相关阅读:
    C#实战Microsoft Messaging Queue(MSMQ)消息队列(干货)
    实现动态的XML文件读写操作(依然带干货)
    多线程下访问控件的方式(您一定会用到,附源码啦!)
    Microsoft.VisualBasic.dll的妙用(开发中肯定会用到哦)
    vue使用element-ui的el-input监听不了键盘事件解决
    vue强制刷新组件
    asp.net微信公众平台本地调试设置
    武大女硕士面试被拒,改简历冒充本科生找工作的感想(原创)
    完整的站内搜索Demo(Lucene.Net+盘古分词)
    ASP.NET多线程下使用HttpContext.Current为null解决方案
  • 原文地址:https://www.cnblogs.com/mkai/p/5371283.html
Copyright © 2011-2022 走看看