• 第一篇:NSOperation的概念


    一、说明

    NSOperation的作口:配合使用NSOperation和NSOperationQueue也能实现多线程

    NSOperation和NSOperationQueue实现多线程的具体步骤:

    1.先将需要执行的操作封装到一个NSOperation对象中

    2.然后将NSOperation对象添加到NSOperationQueue中

    3.系统会自动将NSOperationQueue中的NSOperation取出来

    4.会将封装好的NSOperation进行操作放到一天新的线程中执行

    二、次要

    NSOperation是个抽象类,并不具备封装操作的能力,必须使用它的子类

    使用方式有3种:

    1.NSInvocationOperation

    2.NSBlockOperation

    3.自定义子类继承NSOperation,实现内部相应的方法

    三、具体说明

    1.NSInvocatioO

    //创建操作对象,封装要执行的任务
    //NSInvocationOperation 封装操作
    NSInvocationOperation *operation=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test) object:nil];

    //执行操作
    [operation start];

    peration子类的创建和执行操作

    注意:

    1.一旦执行操作,就会调用target的test方法

    2.操作对象默认在主线程中执行,只有添加到队列才会开启新的线程。即默认情况下,如果操作没有放到队列中queue中,都是同步执行的,只是将NSOperation放到了一个NSOperationQueue中,才会异步执行操作。

    //
    // ViewController.m
    // 01-NSOperation基本1
    //
    // Created by  on 14-6-25.
    // Copyright (c) 2014年 itcast. All rights reserved.
    //

    #import "ViewController.h"

    @interface ViewController ()

    @end

    @implementation YYViewController

    - (void)viewDidLoad
    {
    [super viewDidLoad];

    //NSOperation:抽象类,不具备封装功能

    //创建操作对象,封装要执行的任务
    //NSInvocationOperation 封装操作
    NSInvocationOperation *operation=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test) object:nil];

    //执行操作
    [operation start];

    }

    -(void)test
    {

    NSLog(@"--test--%@--",[NSThread currentThread]);
    }
    @end

    打印结果:

    2.NSBlckOperation子类创建对象和添加操作:

    //创建NSBlockOperation操作对象
    NSBlockOperation *operation=[NSBlockOperation blockOperationWithBlock:^{
    //......
    }];

    //添加操作
    [operation addExecutionBlock:^{
    //....
    }];

    显示代码:

    //
    // ViewController.m
    // 02-NSTherad基本2
    //
    // Created by  on 14-6-25.
    // Copyright (c) 2014年 itcast. All rights reserved.
    //

    #import "ViewController.h"

    @interface ViewController ()

    @end

    @implementation YYViewController

    - (void)viewDidLoad
    {
    [super viewDidLoad];

    //创建NSBlockOperation操作对象
    NSBlockOperation *operation=[NSBlockOperation blockOperationWithBlock:^{
    NSLog(@"NSBlockOperation------%@",[NSThread currentThread]);
    }];


    //开启执行操作
    [operation start];

    }
    @end

    打印结果:

    3.NSOperationQueue的作用:NSOperation可以调用start方法来执行任务,但默认是同步执行的如果将NSOperation添加到NSOperationQueue(操作队列)中,系统会自动异步执行NSOperation中的操作添加操作NSOperationQueue中,自动开启线程。

    //创建NSOperationQueue
    NSOperationQueue * queue=[[NSOperationQueue alloc]init];
    //把操作添加到队列中
    //第一种方式
    [queue addOperation:operation1];
    [queue addOperation:operation2];
    [queue addOperation:operation3];
    //第二种方式
    [queue addOperationWithBlock:^{
    NSLog(@"NSBlockOperation3--4----%@",[NSThread currentThread]);
    }];

    -(void)addOperation:(NSOperation*)op;

    -(void)addOperationWithBlock:(^)(void)block;

    代码示例:

    //
    // YYViewController.m
    // 03-NSOperation基本3
    //
    // Created by 孔医己 on 14-6-25.
    // Copyright (c) 2014年 itcast. All rights reserved.
    //

    #import "YYViewController.h"

    @interface YYViewController ()

    @end

    @implementation YYViewController

    - (void)viewDidLoad
    {
    [super viewDidLoad];

    //创建NSInvocationOperation对象,封装操作
    NSInvocationOperation *operation1=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test1) object:nil];
    NSInvocationOperation *operation2=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(test2) object:nil];
    //创建对象,封装操作
    NSBlockOperation *operation3=[NSBlockOperation blockOperationWithBlock:^{
    NSLog(@"NSBlockOperation3--1----%@",[NSThread currentThread]);
    }];
    [operation3 addExecutionBlock:^{
    NSLog(@"NSBlockOperation3--2----%@",[NSThread currentThread]);
    }];

    //创建NSOperationQueue
    NSOperationQueue * queue=[[NSOperationQueue alloc]init];
    //把操作添加到队列中
    [queue addOperation:operation1];
    [queue addOperation:operation2];
    [queue addOperation:operation3];
    }

    -(void)test1
    {
    NSLog(@"NSInvocationOperation--test1--%@",[NSThread currentThread]);
    }

    -(void)test2
    {
    NSLog(@"NSInvocationOperation--test2--%@",[NSThread currentThread]);
    }

    @end

    打印结果:

    注意:系统会自动将NSOperationQueue中的NSOperation对象取出,将其封装的操作放到一条新的线程中执行。上面的代码示例中,一共有四个任务,operation1和operation2分别有一个任务,operation3有两个任务。一共四个任务,开启了四条线程。通过任务执行的时间全部都是273可以看出,这些任务并行执行的。(队列取出是有顺序的,与打印结果并不矛盾)

  • 相关阅读:
    VMware workstation安装Windows Server 2012 R2步骤详解(附下载链接)
    英文系统下Oracle SQL Developer 汉化
    C# .NET Core Linux、Windows统一文件路径解决方法
    C# DataTable 转JSON、List 转DataTable、DataTable转List
    IIS无法启动计算机上"."的服务W3SVC(World Wide Web 发布服务)正在停止
    SQLServer 数据库变成单个用户后无法访问的解决方法
    C# webform中无法获取修改后的textbox值
    SqlServer try catch 捕获触发器存储过程异常,结合 transaction 事务
    DataTable.Select筛选过滤数据返回DataRow[]转为DataTable添加到DataSet
    easyui datagrid checkbox复选框取消单击选中事件、初始全选全不选等问题解决
  • 原文地址:https://www.cnblogs.com/jinchengvs/p/4888671.html
Copyright © 2020-2023  润新知