多线程NSOperation的使用

NSOperation/NSOperationQueue面向对象的线程技术。

NSOperation:不需要关心线程管理,数据同步的事情,可以把精力放在自己需要执行的操作上。NSOpertion是面向对象的。

NSOperation的创建以及常用的方法:

 1 //创建线程队列
 2     NSOperationQueue *queue = [[NSOperationQueue alloc]init];
 3
 4     //关闭暂停队列,用于让所有的线程加入队列后在执行任务
 5     [queue setSuspended:YES];
 6
 7     //设置最大并发数,
 8     queue.maxConcurrentOperationCount = 2;
 9
10     //创建线程
11     NSInvocationOperation *operation1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(operation1:)  object:@"operation1"];
12
13     //设置线程优先级
14     operation1.queuePriority = NSOperationQueuePriorityNormal;
15
16     //创建第二个线程
17     NSInvocationOperation *operation2 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(operation2:) object:@"operation2"];
18     //设置线程优先级
19     operation2.queuePriority = NSOperationQueuePriorityVeryHigh;
20
21     //将线程加入队列
22     [queue addOperation:operation1];
23     [queue addOperation:operation2];
24
25
26     //用Block创建多线程
27
28     [queue addOperationWithBlock:^{
29
30       //注意这里我们要将任务放进自动释放池,因为这段代码不在(主线程)中
31         @autoreleasepool {
32
33             for (int i = 0; i < 10; i ++) {
34
35                 NSLog(@"operation3%d",i);
36             }
37         }
38     }];
39
40
41     //开始队列
42     [queue setSuspended:NO];

说完创建方式及常用方法,属性。也来说说其解决主线程阻塞的问题

例子跟上篇文章大致是一样的。

类目中的主要代码:

#import "UIImageView+cache.h"

@implementation UIImageView (cache)

- (void)setImages:(NSString *)str
{
    //创建队列
    NSOperationQueue *queue = [[NSOperationQueue alloc]init];

    //设置最大并发
    queue.maxConcurrentOperationCount = 1;
    //创建线程
    NSInvocationOperation *operation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(operationAction:) object:str];

    //将线程加入线程队列
    [queue addOperation:operation];

}

- (void)operationAction:(NSString *)str
{
    NSURL *url = [NSURL URLWithString:str];

    NSData *data = [NSData dataWithContentsOfURL:url];

    //在这里我们要修改UI了所以要重新回到主线程
    //第一种回主线程的方式
    [self performSelectorOnMainThread:@selector(setImage:) withObject:[UIImage imageWithData:data] waitUntilDone:YES];
    /*
     //第二种方式回到主线程

     [[NSOperationQueue mainQueue] addOperationWithBlock:^{

     self.image = [UIImage imageWithData:data];

     }];

     */

}

@end

viewController中的代码:
#import "ViewController.h"
#import "UIImageView+cache.h"
@interface ViewController ()

@property (nonatomic, strong)NSMutableArray *dataArr;

@end

@implementation ViewController

- (NSMutableArray *)dataArr
{
    if (_dataArr == nil) {
        _dataArr = [NSMutableArray array];

        return _dataArr;
    }

    return _dataArr;
}

- (void)viewDidLoad {
    [super viewDidLoad];

    for (int i = 0; i < 8; i ++) {
        for (int j = 0; j < 6; j ++) {

            UIImageView *imageview = [[UIImageView alloc]initWithFrame:CGRectMake(j * 64, i * 80, 60, 75)];
            imageview.backgroundColor = [UIColor yellowColor];

            [self.view addSubview:imageview];

            [self.dataArr addObject:imageview];

        }
    }

}
- (IBAction)click:(UIButton *)sender {

    for (UIImageView *imageview in self.dataArr) {

        [imageview setImages:@"http://img31.mtime.cn/pi/2013/03/08/144644.81111130_1280X720.jpg"];

    }
}

@end
这样就解决了主线程阻塞的问题。
时间: 2024-11-06 16:52:51

多线程NSOperation的使用的相关文章

【iOS】多线程NSOperation

NSOperation是苹果封装的一套多线程的东西,不像GCD是纯C语言的,这个是OC的.但相比较之下GCD会更快一些,但本质上NSOPeration是多GDC的封装. 一.NSOperation与GCD的比较 GCD是基于c的底层api,NSOperation属于object-c类.ios首先引入的是NSOperation,IOS4之后引入了GCD和NSOperationQueue并且其内部是用gcd实现的. GCD优点:GCD主要与block结合使用.代码简洁高效.执行效率稍微高点. NSO

多线程----NSOperation

NSOperation是Cocoa中的一个抽象类,用来封装单个任务和代码执行一项操作,由于是抽象类,所以不能直接实例化使用,必须定义子类继承该抽象类来实现, 使用NSOperation的方式有两种: 一种是用定义好的两个子类: NSInvocationOperation 和 NSBlockOperation,有相关的使用方法. NSOperation的子类NSInvocationOperation提供了一套简单的多线程编程方法,是IOS多线程编程中最简单的一种实现方式. 另一种是继承NSOper

iOS:操作队列实现多线程NSOperation

NSOperation具体使用:直接继承NSObject 它的子类有:NSBlockOperation.NSInvocationOperation 还有一个必须的类,队列,用来装创建的线程 NSOperationQueue 理解:这个方式是如何实现多线程呢?是通过操作队列来实现多线程的.即主线程是一个主队列,再创建一个队列并将其他的线程加入其中同步执行.如果对共享资源的争夺放在主线程队列中,则不需要关心线程管理,数据同步的事情,可以把精力放在自己需要执行的操作上:否则的话,仍需要关心数据同步的问

多线程NSOperation使用方法

/*------------------------------  NSOperation使用   -----------------------------------*/ 重点:操作 NSOperation 和操作队列 NSOperationQueue! { 1.NSOperation(操作)简介: NSOperation: // 本质是对 GCD 的封装, OC 语言. NSOperation 和 GCD 的比较: GCD使用场合: 一些简单的需求,简单的多线程操作. //简单高效 NSO

四:多线程--NSOperation简单介绍

一.NSOperation简介 1.NSOperation的作?:配合使用NSOperation和NSOperationQueue也能实现多线程编程 NSOperation和NSOperationQueue实现多线程的具体步骤: (1)先将需要执行的操作封装到一个NSOperation对象中 (2)然后将NSOperation对象添加到NSOperationQueue中 (3)系统会?动将NSOperationQueue中的NSOperation取出来 (4)将取出的NSOperation封装的

iOS开发——多线程OC篇&amp;(九)多线程NSOperation介绍

NSOperation介绍 一.NSOperation简介 1.简单说明 NSOperation的作?:配合使用NSOperation和NSOperationQueue也能实现多线程编程 NSOperation和NSOperationQueue实现多线程的具体步骤: (1)先将需要执行的操作封装到一个NSOperation对象中 (2)然后将NSOperation对象添加到NSOperationQueue中 (3)系统会?动将NSOperationQueue中的NSOperation取出来 (4

iOS中的多线程 NSOperation

在ios中,使用多线程有三种方式,分别是:NSThread.NSOperation和NSOperationQueue.GCD,在本节,主要讲解一下NSOperation的使用. NSOperation和NSOperationQueue这种方式实际上是将NSOperation的对象放到一个NSOperationQueue队列中,然后依次启动操作,类似于线程池的使用. 在使用的过程中,NSOperation的操作使用的是它的子类,分别是NSInvocationOperation和NSBlockOpe

多线程nsoperation

不能直接使用NSOperation,而是使用系统定义的子类来完成实际任务 两个子类:NSInvocationOperation和 NSBlockOperation 他们只能执行一次任务,而且不能再次执行他,可以将它添加到一个操作队列中执行,这个可以用NSOperationQueue实现 NSOperation的创建方式,可以用定义好的两个子类创建 //第一种 NSInvocationOperation *op1 = [[NSInvocationOperation alloc]initWithTa

IOS多线程--NSOperation\NSOperationQueue

iOS中,有多种多线程方式,但是,苹果公司建议我们用NSOperation技术 1.GCD是纯C的,对面向对象的程序员不友好 2.GCD对编程管理还不是很强大 NSOperation 其实底层实现是基于GCD来做的 dispatch_queue_t ==  NSOperationQueue dispatch_async == NSOperation dispatch_sync  == NSOperation NSOperation是个抽象类 使用它的两个子类 NSInvocationOperat

iOS之多线程NSOperation

目前在 iOS 和 OS X 中有两套先进的同步 API 可供我们使用:NSOperation 和 GCD .其中 GCD 是基于 C 的底层的 API ,而 NSOperation 则是 GCD 实现的 Objective-C API. 1. 什么时候使用NSOperationQueue而不是GCD 比如你可能写过类似这样的代码(这样来请求网络数据): 1 dispatch_async(_Queue, ^{ 2 3 //请求数据 4 NSData *data = [NSData dataWit