多线程编程方式——NSOperation

前言:

多线程编程是防止主线程堵塞,增加运行效率等等的最佳方法,而原始的多线程方法编程方法有很多毛病,包括线程锁死等。在Cocoa中,Apple提供了NSOperation这个类,提供了一个优秀的多线程编写方法。

首先是建立NSOperationQueue和NSOperation、NSOperationQueue会建立一个线程管理器。每一个加入到线程的NSOperation会有序的执行。

一、什么是NSOperation?

NSOperation是除NSThread之外的第二种多线程编程方式。

采用NSOperation(线程操作,通常用他的子类)和NSOperationQueue(线程队列)搭配来做多线程的开发。采用NSOperation指定一个操作。把这个操作放到线程队列(线程池)中。让线程队列来安排它的生命周期。

二、NSOperation与NSThread有什么区别?

 ①、NSThread需要启动,也就是说需要费心管理线程的生命周期,而采用NSOperation只需要将线程放到线程队列中即可、线程队列负责管理、执行所有的线程操作。

②、管理线程的最大并发数,也就是同时执行任务数。

③、控制线程之间的依赖关系,NSOperation之间可以设置依赖以保证顺序执行,比如一定要让操作1执行完后,才能执行操作2,线程之间不能相互依赖。比如A依赖B、B又依赖A。

④、队列的取消、暂停、恢复

下面代码实际展示NSOperation的应用

使用NSOperationQueue的过程:

1)建立一个NSOperationQueue的对象

2)建立一个NSOperation(一般都是用它的子类)对象

3)将NSOperation对象加入到NSOperationQueue中

NSOperation开发总共有三种方式

   1、NSInvocationIOperation和NSOperationQueue搭配进行多线程开发

  2、NSBlockOperation和NSOperationQueue搭配开发多线程

3、用自定义与NSOperation的类与NSOperation搭配

#pragma mark****此处练习是利用多线程加载网络图片******

步骤:

1.创建视图

2.创建线程队列

3.创建线程

4.将线程放到线程队列中

5.在子线程加载网络资源

6.回到主线程

7.更新UI

*********************************************

//

//  ViewController.m

//  NSOperation的复习

//

//  Created by scsys on 16/3/3.

//  Copyright © 2016年 pls. All rights reserved.

//

#import "ViewController.h"

//宏定义一个网络资源文件的路径

#define kurl @"http://store.storeimages.cdn-apple.com/8748/as-images.apple.com/is/image/AppleInc/aos/published/images/s/38/s38ga/rdgd/s38ga-rdgd-sel-201601?wid=848&hei=848&fmt=jpeg&qlt=80&op_sharpen=0&resMode=bicub&op_usm=0.5,0.5,0,0&iccEmbed=0&layer=comp&.v=1454777389943"

@interface ViewController ()

{

UIImageView *imageView;

}

@end

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

//利用多线程加载一张网络图片

// 步骤:

/*

1、创建一个视图

2、创建一个线程队列

3、创建一个线程

4、将线程添加到线程队列中

5、在子线程中加载网络资源

6、回到主线程

7、更新UI

*/

//1.创建一个视图、此处一般将视图设为全局变量

imageView = [[UIImageView alloc]initWithFrame:CGRectMake(50, 200, 200, 200)];

//  让加载的网络图片根据imageView的大小自适应

imageView.contentMode = UIViewContentModeScaleAspectFit;

[self.view addSubview:imageView];

//2、创建一个线程队列

// 在此处直接用了一个new,相当于直接给它alloc、init了。不用写的那么复杂

NSOperationQueue *operationQueue = [NSOperationQueue new];

//3、创建一个线程,此处用NSOperation的子类(NSInvocationOperation)

// 创建一个NSInvocationOperation对象,并初始化到方法。

// 在这里selcetor参数后面的值是你想在另外一个线程中运行的方法(函数,Method)

// 在这里object后的值是想传递给前面方法的数据

NSInvocationOperation *invocationOperation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(loadResource) object:nil];

//4、将线程添加到线程队列中

// 下面将我们建立的操作“operation”加入到本地程序的共享队列中,(加入后方法就会立刻被执行)

[operationQueue addOperation:invocationOperation];

}

//5、在子线程中加载网络资源

-(void)loadResource{

NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:kurl        ]];

UIImage *image = [UIImage imageWithData:data];

//6、回到主线程

[[NSOperationQueue mainQueue]addOperationWithBlock:^{

//7、更新UI

imageView.image = image;

}];

}

- (void)didReceiveMemoryWarning {

[super didReceiveMemoryWarning];

// Dispose of any resources that can be recreated.

}

@end


#pragma mark ----NSOperation的第二种开发方式-------NSBlockOperation

#pragma mark=====NSOperation的第二种开发方式==========

-(void)viewDidLoad{

[super viewDidLoad];

self.view.backgroundColor = [UIColor whiteColor];

self.edgesForExtendedLayout =  UIRectEdgeNone ;

//1、创建一个视图

imageView = [[UIImageView alloc]initWithFrame:CGRectMake(50, 50, 200, 200)];

imageView.contentMode = UIViewContentModeScaleAspectFit;

[self.view addSubview:imageView];

//2、创建一个县城队列

NSOperationQueue *operationQueue = [NSOperationQueue new];

//3、创建一个线程

NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{

//5、加载网络资源文件

NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:kurl]];

UIImage *image = [UIImage imageWithData:data];

//6、回到主线程

[[NSOperationQueue mainQueue]addOperationWithBlock:^{

// 7、更新UI

imageView.image = image;

}];

}];

//4、将线程放到线程队列中

[operationQueue addOperation:blockOperation];

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容