iOS NSOperation基本使用

来源:互联网 发布:mac lol 编辑:程序博客网 时间:2024/05/01 22:43

//

//  ViewController.m

//  NSOperaiton 使用Demo

//

//  Created by 邹彦军 on 16/7/20.

//  Copyright © 2016邹彦军. All rights reserved.

//


#import "ViewController.h"


@interface ViewController ()


@end


@implementation ViewController


- (void)downloadImage:(id)obj {

    

    NSLog(@"\n当前线程:%@\n传递的对象:%@", [NSThread currentThread], obj);

}



- (void)viewDidLoad {

    [superviewDidLoad];


    [selfoperationDemo7];

}



- (void)operationDemo1 {

    

    NSInvocationOperation *op = [[NSInvocationOperationalloc]initWithTarget:selfselector:@selector(downloadImage:)object:@"invocation"];

    // start方法会在当前线程(当前是主线程)执行 @selector方法

    [op start];

}


- (void)operationDemo2 {

    // 新队列

    NSOperationQueue *queue = [NSOperationQueuenew];

    // 操作

    NSInvocationOperation *op = [[NSInvocationOperationalloc]initWithTarget:selfselector:@selector(downloadImage:)object:@"invocation"];

    // 新队列添加任务会异步执行 downloadImage:方法

    [queue addOperation:op];

}


- (void)operationDemo3 {// 添加多个任务

    

    NSOperationQueue *queue = [NSOperationQueuenew];

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

        NSInvocationOperation *op = [[NSInvocationOperationalloc]initWithTarget:selfselector:@selector(downloadImage:)object:@(i)];

        // 执行效果:会开启多条线程,所有任务没有顺序执行,效果与GCD的并发队列&异步执行效果一样

        [queue addOperation:op];

    }

}


- (void)operationDemo4 {// 效果和operationDemo2一样

    

    NSOperationQueue *queue = [NSOperationQueuenew];

    

    // 使用block定义操作,代码写在一起方便管理、维护

    NSBlockOperation *op = [NSBlockOperationblockOperationWithBlock:^{

        [selfdownloadImage:@"invocation"];

    }];

    [queue addOperation:op];

}


- (void)operationDemo5 {// 效果和operationDemo4一样,写法更简单

    

    NSOperationQueue *queue = [NSOperationQueuenew];

    

    // 更简单的,直接添加Block

    [queue addOperationWithBlock:^{

        [selfdownloadImage:@"invodation"];

    }];

}


- (void)operationDemo6 {// 队列中可以添加任何 NSOperation的子类

    

    NSOperationQueue *queue = [NSOperationQueuenew];

    

    NSBlockOperation *op1 = [NSBlockOperationblockOperationWithBlock:^{

        [selfdownloadImage:@"invocation"];

    }];

    // 添加 NSBlockOperation操作

    [queue addOperation:op1];

    

    NSInvocationOperation *op2 = [[NSInvocationOperationalloc] initWithTarget:selfselector:@selector(downloadImage:)object:@"invocation"];

    // 添加 NSInvocationOperation操作

    [queue addOperation:op2];

    

}


- (void)operationDemo7 {// 线程间通讯

    

    NSOperationQueue *queue = [NSOperationQueuenew];

    

    [queue addOperationWithBlock:^{// 子线程下载任务

        

        [selfdownloadImage:@"invocation"];

        

        [[NSOperationQueuemainQueue]addOperationWithBlock:^{// 回到主线程更细UI

            NSLog(@"回到主线程更新UI");

        }];

    }];

}


@end

0 0