zoukankan      html  css  js  c++  java
  • 多线程补充day02

    01-使用create函数创建的并发队列和全局并发队列的主要区别:

       1.全局并发队列在整个应用程序中本身是默认存在的,并且对应的有高优先级,低优先级,默认优先级,后台优先级共四个并发队列。

       2.使用栅函数时候,苹果官方规定栅栏函数只有在和使用creste函数一起使用才有效。

      

    02-xcode 7.0版本之后。http请求问题修改info.plist的NSAppTransportSecurity修改为字典类型,添加NSAllowArbitraryLoadskey修改为YES。

    #####################

    01-单例模式

    (1)单例模式在程序运行过程中,一个类只有一个实例

    (2)在整个应用程序中,共享一份资源(这份资源只需要创建初始化一次)

    02- ARC实现单例

      (1)在类内部提供一个static修饰的全局变量

       (2)提供一个类方法,方便外界访问

       (3)重写+allocWithZone方法,保证永远都只为单例对象分配一次内存空间

        (4)严谨起见,重写-copyWithZone方法和-MutableCopyWithZone方法

    03-MRC实现单例很少用,自己查代码。

    #######################

    2.NSOperation基本使用

      1.NSOperation是对GCD的包装,两个核心概念[队列+操作]

      2.NSOperation本身是抽象类,只能只有它的子类。三个子类分别是:NSBlockOperation,NSInvocationOperaion,以及自定义继承自NSOperation的类。NSOperation和NSOperationQueue结合使用实现多线程并发。

    (3)相关代码

    ```objc

    //  01 NSInvocationOperation

        //1.封装操作

        /*

         第一个参数:目标对象

         第二个参数:该操作要调用的方法,最多接受一个参数

         第三个参数:调用方法传递的参数,如果方法不接受参数,那么该值传nil

         */

        NSInvocationOperation *operation = [[NSInvocationOperation alloc]

                                            initWithTarget:self selector:@selector(run) object:nil];

        //2.启动操作

        [operation start];

    -------------------------------------------------

        //  02 NSBlockOperation

        //1.封装操作

        /*

         NSBlockOperation提供了一个类方法,在该类方法中封装操作

         */

        NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{

            //在主线程中执行

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

        }];

        //2.追加操作,追加的操作在子线程中执行

        [operation addExecutionBlock:^{

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

        }];

        [operation addExecutionBlock:^{

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

        }];

        //3.启动执行操作

        [operation start];

    ----------------------------------------------

    // 03 自定义NSOperation

        //如何封装操作?

        //自定义的NSOperation,通过重写内部的main方法实现封装操作

        -(void)main

        {

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

        }

        //如何使用?

        //1.实例化一个自定义操作对象

        XMGOperation *op = [[XMGOperation alloc]init];

        //2.执行操作

        [op start];

    ```

    - 2.2 NSOperationQueue基本使用

    (1)NSOperation中的两种队列

        01 主队列 通过mainQueue获得,凡是放到主队列中的任务都将在主线程执行

        02 非主队列 直接alloc init出来的队列。非主队列同时具备了并发和串行的功能,通过设置最大并发数属性来控制任务是并发执行还是串行执行

    (2)相关代码

    ```objc

    //自定义NSOperation

    -(void)customOperation

    {

        //1.创建队列

        NSOperationQueue *queue = [[NSOperationQueue alloc]init];

        //2.封装操作

        //好处:1.信息隐蔽

        //2.代码复用

        XMGOperation *op1 = [[XMGOperation alloc]init];

        XMGOperation *op2 = [[XMGOperation alloc]init];

        //3.添加操作到队列中

        [queue addOperation:op1];

        [queue addOperation:op2];

    }

    //NSBlockOperation

    - (void)block

    {

        //1.创建队列

        NSOperationQueue *queue = [[NSOperationQueue alloc]init];

        //2.封装操作

        NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{

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

        }];

        NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{

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

        }];

        [op2 addExecutionBlock:^{

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

        }];

        [op2 addExecutionBlock:^{

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

        }];

        //3.添加操作到队列中

        [queue addOperation:op1];

        [queue addOperation:op2];

        //补充:简便方法

        [queue addOperationWithBlock:^{

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

        }];

    }

    //NSInvocationOperation

    - (void)invocation

    {

        /*

         GCD中的队列:

         串行队列:自己创建的,主队列

         并发队列:自己创建的,全局并发队列

         NSOperationQueue

         主队列:[NSOperationQueue mainqueue];凡事放在主队列中的操作都在主线程中执行

         非主队列:[[NSOperationQueue alloc]init],并发和串行,默认是并发执行的

         */

        //1.创建队列

        NSOperationQueue *queue = [[NSOperationQueue alloc]init];

        //2.封装操作

        NSInvocationOperation *op1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(download1) object:nil];

        NSInvocationOperation *op2 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(download2) object:nil];

        NSInvocationOperation *op3 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(download3) object:nil];

        //3.把封装好的操作添加到队列中

        [queue addOperation:op1];//[op1 start]

        [queue addOperation:op2];

        [queue addOperation:op3];

    }

    2.3NSOperation其他用法

    1,设置最大并发数[控制任务并发和串行]

    (1)设置最大并发数【控制任务并发和串行】

    ```objc

    //1.创建队列

        NSOperationQueue *queue = [[NSOperationQueue alloc]init];

        //2.设置最大并发数

        //注意点:该属性需要在任务添加到队列中之前进行设置

        //该属性控制队列是串行执行还是并发执行

        //如果最大并发数等于1,那么该队列是串行的,如果大于1那么是并行的

        //系统的最大并发数有个默认的值,为-1,如果该属性设置为0,那么不会执行任何任务

        queue.maxConcurrentOperationCount = 2;

    ```

    (2)暂停和恢复以及取消

    ```objc

        //设置暂停和恢复

        //suspended设置为YES表示暂停,suspended设置为NO表示恢复

        //暂停表示不继续执行队列中的下一个任务,暂停操作是可以恢复的

        if (self.queue.isSuspended) {

            self.queue.suspended = NO;

        }else

        {

            self.queue.suspended = YES;

        }

        //取消队列里面的所有操作

        //取消之后,当前正在执行的操作的下一个操作将不再执行,而且永远都不在执行,就像后面的所有任务都从队列里面移除了一样

        //取消操作是不可以恢复的

        [self.queue cancelAllOperations];

    ---------自定义NSOperation取消操作--------------------------

    -(void)main

    {

        //耗时操作1

        for (int i = 0; i<1000; i++) {

            NSLog(@"任务1-%d--%@",i,[NSThread currentThread]);

        }

        NSLog(@"+++++++++++++++++++++++++++++++++");

        //苹果官方建议,每当执行完一次耗时操作之后,就查看一下当前队列是否为取消状态,如果是,那么就直接退出

        //好处是可以提高程序的性能

        if (self.isCancelled) {

            return;

        }

        //耗时操作2

        for (int i = 0; i<1000; i++) {

            NSLog(@"任务1-%d--%@",i,[NSThread currentThread]);

        }

        NSLog(@"+++++++++++++++++++++++++++++++++");

    }

    ```

    #########################

    多图下载综合实例程序

    1>涉及知识点

       1字典转模型

       2存储数据到沙河,从沙河中加载数据

       3占位图的设置(cell的刷新问题)

       4如何进行内存缓存(使用NSDictionary

      05 在程序开发过程中的一些容错处理

       06 如何刷新tableView的指定行(解决数据错乱问题)

       07 NSOperation以及线程间通信相关知识

  • 相关阅读:
    设计模式(六)—原型模式Prototype(创建型)
    hdu_2039_三角形_解题报告
    古代赌局 俗话说:十赌九输。因为大多数赌局的背后都藏有阴谋。不过也不尽然,有些赌局背后藏有的是:“阳谋”。 有一种赌局是这样的:桌子上放六个匣子,编号是1至6。多位参与者(以下称玩家)可以把
    读《Boost程序库完全开发指南》
    使用HttpSessionListener接口监听Session的创建和失效
    HDU2317:Nasty Hacks
    意淫的需求要不得
    enumerate(s)与range(len(s))的作用是相同
    一种数据展示方式,UI设计新颖,供大家参考(源码部分) (demo已经上传)
    RMAN Compressed Backupset
  • 原文地址:https://www.cnblogs.com/paoxiaoqianzibi/p/5067782.html
Copyright © 2011-2022 走看看