zoukankan      html  css  js  c++  java
  • iOS-多线程(2)

    多线程之NSOperation:

    多线程的优点:

    1. 使用线程可以把占据时间长的程序中的任务呀放到后台去处理
    2. 用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度
    3. 程序的运行速度可能加快
    4. 在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下可以释放一些珍贵的资源如内存占用等等。

    多线程的缺点:

    1. 如果有大量的线程,会影响性能,因为操作系统需要在它们之间切换。
    2. 更多的线程需要更多的内存空间。
    3. 线程可能会给程序带来更多“bug”,因此要小心使用。
    4. 线程的中止需要考虑其对程序运行的影响。
    5. 通常块模型数据是在多个线程间共享的,需要防止线程死锁情况的发生。

    使用NSOperation和NSOperationQueue实现多线程

    1. 创建NSOperation
    2. 把创建的NSOperation对象方法添加到NSOperationQueue中
    3. 系统自动去NSOperationQueue操作队列中取到一个NSOperation对象,并开启一个分线程去执行操作

         注意:

    1. NSOperation是一个抽象类,不具备创建对象的能力。
    2. 我们可以使用NSOperation的子类去创建对象(NSInvocationOperation, NSBlockOperation)
    3. 我们也可以自定义NSOperation

    NSInvocationOperation

    NSInvocationOperation *operation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(operationText) object:nil];
    [operation start];

     NSInvocationOperation创建的对象默认实在主线程中执行。

    NSInvocationOperation *operation1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(operationText) object:nil];
    NSInvocationOperation *operation2 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(operationText) object:nil];
    NSOperationQueue *queue = [[NSOperationQueue alloc]init];
    [queue addOperation:operation1];
    [queue addOperation:operation2];
    

     将操作放入队列中,在分线程中执行。

    [queue setMaxConcurrentOperationCount:5];
    

     队列以此可以最多执行的分线程。超出,则先执行完,在执行多余的。

    NSBlockOperation

    NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{
            [NSThread sleepForTimeInterval:5];
            NSLog(@"方法 :%d",[NSThread isMainThread]);
        }];
    [operation2 start];
    

     NSBlockOperation创建的对象默认是在主线程中执行的。

    NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{
            [NSThread sleepForTimeInterval:5];
            NSLog(@"方法 :%d",[NSThread isMainThread]);
        }];
    [operation2 addExecutionBlock:^{
            [NSThread sleepForTimeInterval:5];
            NSLog(@"方法1 :%d",[NSThread isMainThread]);
        }];
    [operation2 start]
    

     我们可以在block中添加其它任务,其它任务正常情况下是在分线程中执行。

     NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{
            NSLog(@"方法1 :%d",[NSThread isMainThread]);
        }];
    NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{
            NSLog(@"方法2 :%d",[NSThread isMainThread]);
        }];
        
    NSOperationQueue *queue = [[NSOperationQueue alloc]init];
    [queue addOperation:operation1];
    [queue addOperation:operation2];
    

     这样创建的方法都在分线程中执行。

    自定义NSOperation对象

    我们需要创建一个类,继承自NSOperation.

    在类中实现-(void)main(){//实现的内容}

    myOperation *operation1 = [[myOperation alloc]init];
    myOperation *operation2 = [[myOperation alloc]init];
    myOperation *operation3 = [[myOperation alloc]init];
    NSOperationQueue *queue = [[NSOperationQueue alloc]init];
    [queue addOperation:operation1];
    [queue addOperation:operation2];
    [queue addOperation:operation3];
    

     我们可以设定操作对象的执行顺序。

    1. 通过依赖关系
    2. 通过优先级
    [operation1 addDependency:operation2];
    

     operation1依赖operation2,先执行operation2,再执行operation1

    [operation3 setQueuePriority:NSOperationQueuePriorityHigh];
    

     设置operation3的优先级

     取消操作

    [operation1 cancel];
    

     取消某个操作。

    [queue cancelAllOperations];
    

     取消队列中的所有操作。

    暂停操作

    [queue setSuspended:YES];
    [queue setSuspended:NO];
    
  • 相关阅读:
    Caffe--solver.prototxt配置文件 参数设置及含义
    关于KMP算法理解(快速字符串匹配)
    Lintcode--004(最小子串覆盖)
    Lintcode--003(乱序字符串)
    Lintcode--002(两个字符串是变位词)
    Lintcode--001(比较字符串)
    闭包的应用实例
    JavaScript完整性检查
    null和undefined相等比较
    JavaScript逻辑运算符(操作数运算符)
  • 原文地址:https://www.cnblogs.com/wangyaoguo/p/4843846.html
Copyright © 2011-2022 走看看