当前位置:首页 > 操作系统 > Ios

ios开发多线程一:了解-NSOperation的基本使用

 


#import "viewcontroller.h" @interface viewcontroller ()@end @implementation viewcontroller-(void)touchesbegan:(nsset<uitouch *> *)touches withevent:(uievent *)event {
    [self blockoperation];
}/**
 *    1:nsoperation封装任务的两种方式:nsinvocationoperation,nsblockoperation,其中两种方法若没指定队列,则默认是在主队列里去执行
 2:住家任务:addexecutionblock:
 注意:如果一个操作中的任务数量大于1,那么会开子线程并发执行任务
 
 注意:不一定是子线程,有可能是主线程
 */ -(void)invocationopeation
{
    
    //1.创建操作,封装任务     /*      第一个参数:目标对象 self
     第二个参数:调用方法的名称
     第三个参数:前面方法需要接受的参数 nil
     */      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];
    
    //2.启动|执行操作      [op1 start];
     [op2 start];
     [op3 start];
}-(void)blockoperation
{
    //1.创建操作     nsblockoperation *op1 = [nsblockoperation blockoperationwithblock:^{
        nslog(@"1----%@",[nsthread currentthread]);
    }];
    
    nsblockoperation *op2 = [nsblockoperation blockoperationwithblock:^{
        nslog(@"2----%@",[nsthread currentthread]);
    }];
    
    nsblockoperation *op3 = [nsblockoperation blockoperationwithblock:^{
        nslog(@"3----%@",[nsthread currentthread]);
    }];
    
    //追加任务
    //注意:如果一个操作中的任务数量大于1,那么会开子线程并发执行任务
    //注意:不一定是子线程,有可能是主线程     [op3 addexecutionblock:^{
        nslog(@"4---%@",[nsthread currentthread]);
    }];
    
    [op3 addexecutionblock:^{
        nslog(@"5---%@",[nsthread currentthread]);
    }];
    
    [op3 addexecutionblock:^{
        nslog(@"6---%@",[nsthread currentthread]);
    }];
    
    //2.启动     [op1 start];
    [op2 start];
    [op3 start];
}-(void)download1
{
    nslog(@"%s----%@",__func__,[nsthread currentthread]);
}-(void)download2
{
    nslog(@"%s----%@",__func__,[nsthread currentthread]);
}-(void)download3
{
    nslog(@"%s----%@",__func__,[nsthread currentthread]);
}@end

###2.nsoperation

- 2.1 nsoperation基本使用

 

(1)相关概念

 

    01 nsoperation是对gcd的包装

    02 两个核心概念【队列+操作】

 

(2)基本使用

 

    01 nsoperation本身是抽象类,只能只有它的子类

    02 三个子类分别是:nsblockoperation、nsinvocationoperation以及自定义继承自nsoperation的类

    03 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];

```


【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!