<commit_before>---
layout:     post
title:      "iOS多线程(三):NSOperation"
subtitle:   "iOS多线程之NSOperation"
date:       2016-05-24 12:00:00
author:     "Ted"
header-img: "img/default.jpg"
---

#### 1、NSoperation是基于GCD封装的

```
dispatch_async(_Queue, ^{    //请求数据  NSData *data = [NSData dataWithContentURL:[NSURL URLWithString:@"http://domain.com/a.png"]];    dispatch_async(dispatch_get_main_queue(), ^{         [self refreshViews:data];    });});
```

有个致命的问题：这个任务是无法取消的 dataWithContentURL:是同步的拉取数据，它会一直阻塞线程直到完成请求，如果是遇到了超时的情况，它在这个时间内会一直占有这个线程；在这个期间并发队列就需要为其他任务新建线程，这样可能导致性能下降等问题。

#### 2、NSOperationQueue相对于GCD来说有以下优点：

- 提供了在 GCD 中不那么容易复制的有用特性。
- 可以很方便的取消一个NSOperation的执行
- 可以更容易的添加任务的依赖关系
- 提供了任务的状态：isExecuteing, isFinished.

NSOperationQueue 有两种不同类型的队列：主队列和自定义队列。主队列运行在主线程之上，而自定义队列在后台执行。在两种类型中，这些队列所处理的任务都使用 NSOperation 的子类来表述。

我们可以通过设置 maxConcurrentOperationCount 属性来控制并发任务的数量，当设置为 1 时， 那么它就是一个串行队列。主对列默认是串行队列，这一点和 dispatch_queue_t 是相似的。

#### 3、用法

> NSOperation实现

一个是直接使用NSInvocationOperation、NSBlockOperation两个子类，一个是自己实现NSOperation的子类

```objective-c
NSInvocationOperation *invocationOperation = [[NSInvocationOperation alloc]initWithTarget:selfselector:@selector(invocationOperationAction)object:nil];
```

```objective-c
NSBlockOperation*blockOperation = [NSBlockOperationblockOperationWithBlock:^{

}];
```
<commit_msg>多线程跳转<commit_after>---
layout:     post
title:      "iOS多线程(三):NSOperation"
subtitle:   "iOS多线程之NSOperation"
date:       2016-05-24 12:00:00
author:     "Ted"
header-img: "img/default.jpg"
---

#### 1、NSoperation是基于GCD封装的

```
dispatch_async(_Queue, ^{    //请求数据  
NSData *data = [NSData dataWithContentURL:[NSURL URLWithString:@"http://domain.com/a.png"]];    
dispatch_async(dispatch_get_main_queue(), ^{         [self refreshViews:data];    });});
```

有个致命的问题：这个任务是无法取消的 dataWithContentURL:是同步的拉取数据，它会一直阻塞线程直到完成请求，如果是遇到了超时的情况，它在这个时间内会一直占有这个线程；在这个期间并发队列就需要为其他任务新建线程，这样可能导致性能下降等问题。

#### 2、NSOperationQueue相对于GCD来说有以下优点：

- 提供了在 GCD 中不那么容易复制的有用特性。
- 可以很方便的取消一个NSOperation的执行
- 可以更容易的添加任务的依赖关系
- 提供了任务的状态：isExecuteing, isFinished.

NSOperationQueue 有两种不同类型的队列：主队列和自定义队列。主队列运行在主线程之上，而自定义队列在后台执行。在两种类型中，这些队列所处理的任务都使用 NSOperation 的子类来表述。

我们可以通过设置 maxConcurrentOperationCount 属性来控制并发任务的数量，当设置为 1 时， 那么它就是一个串行队列。主对列默认是串行队列，这一点和 dispatch_queue_t 是相似的。

#### 3、用法

> NSOperation实现

一个是直接使用NSInvocationOperation、NSBlockOperation两个子类，一个是自己实现NSOperation的子类

```objective-c
NSInvocationOperation *invocationOperation = [[NSInvocationOperation alloc]initWithTarget:selfselector:@selector(invocationOperationAction)object:nil];
```

```objective-c
NSBlockOperation*blockOperation = [NSBlockOperationblockOperationWithBlock:^{

}];
```

{'fraction_non_alphanumeric': 0.12132629992464206, 'fraction_numerical': 0.013564431047475508, 'mean_word_length': 7.482428115015974, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 5, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '6591844', 'n_tokens_mistral': 1385, 'n_tokens_neox': 1451, 'n_words': 116}