zoukankan      html  css  js  c++  java
  • 多线程之 NSOperation

    NSOperation

    优点:不需要关心线程管理,数据同步的事情,可以把精力放在自己需要执行的操作上。

    NSOperation实例封装了需要执行的操作和执行操作所需的数据,并且能够以并发或非并发的方式执行这个操作。

    NSOperation本身是抽象基类,因此必须使用它的子类,使用NSOperation子类的方式有2种:一种是用定义好的两个子类:NSInvocationOperation 和 NSBlockOperation,另一种是自定义子类继承NSOperation,实现内部相应的方法
    1. NSOperation的作用:配合使用NSOperation和NSOperationQueue也能实现多线程编程取消操作
    2. NSOperation和NSOperationQueue实现多线程的具体步骤:
              A.需要执行的操作封装到一个NSOperation对象中
              B.将NSOperation对象添加到NSOperationQueue中
             C.系统会⾃动将NSOperationQueue中的NSOperation取出来
             D.将取出的NSOperation封装的操作放到⼀条新线程中执⾏
     
     
     
     
        //1.NSInvocationOperation创建操作对象封装要执行的任务

        NSInvocationOperation *operation=[[NSInvocationOperationalloc]initWithTarget:selfselector:@selector(run1) object:nil];

        //执行操作  

        [operation start];

     

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

        NSInvocationOperation *operation1 = [[NSInvocationOperationalloc] initWithTarget:selfselector:@selector(run1) object:nil];

        [operation1 start];

      

        //2.NSBlockOperation

        NSBlockOperation *block=[NSBlockOperationblockOperationWithBlock:^{

            NSLog(@"block操作:%@",[NSThreadcurrentThread]);

        }];

        //NSBlockOperation对象中添加一个操作,如果NSBlockOperation对象至少包含了多个操作,有一个是主线程中执行,其他均在子线程中

        [block addExecutionBlock:^{

            NSLog(@"block操作1%@",[NSThreadcurrentThread ]);

        }];

        [block addExecutionBlock:^{

            NSLog(@"block操作2%@",[NSThreadcurrentThread ]);

        }];

        [block addExecutionBlock:^{

            NSLog(@"block操作3%@",[NSThreadcurrentThread ]);

        }];

        [block start];

        //注意:添加操作要放在start之前

     

     

        //创建队列:将操作放入队列中(主队列除外)默认的在子线程中执行,且不用手动start

        NSOperationQueue *queue=[[NSOperationQueuealloc]init]; //NSOperationQueue的作⽤:NSOperation可以调⽤start⽅法来执⾏任务,但默认是同步执行的。如果将NSOperation添加到NSOperationQueue(操作队列),系统会自动异步执行NSOperation中的操作。添加操作到NSOperationQueue中,自动执行操作,自动开启线程

        NSInvocationOperation *qoperation=[[NSInvocationOperationalloc]initWithTarget:selfselector:@selector(run2) object:nil  ];

        [queue addOperation:qoperation];

        [queue addOperationWithBlock:^{

             NSLog(@"block操作队列:%@",[NSThreadcurrentThread ]);

        }];

        

    }

    -(void)run1{

        NSLog(@"22222%@",[NSThreadcurrentThread]);

    }

    -(void)run2{

        NSLog(@"队列中执行:%@",[NSThreadcurrentThread]);

    }

  • 相关阅读:
    有關window.showModalDialog的應用11/30
    phpmyadmin的查詢不出現10/29
    那點事情我沒有精力做10/17
    水晶報表System.InvalidCastException: 指定的轉換無效11/30
    水晶報表匯出時System.InvalidCastException:指定的格式無效10/29
    读博日记(C#常用开源类库收集
    ASP.net通过JQuery实现Ajax操作
    仿Discuz!的论坛评分发帖弹出提示并渐渐消失的效果
    仿Discuz文本框弹出层的效果
    C#开源资源大汇总
  • 原文地址:https://www.cnblogs.com/wyhwyh2114/p/5033691.html
Copyright © 2011-2022 走看看