多線程-NSOperation

An operation object is an instance of the NSOperation class (in the Foundation framework) that you use to encapsulate work you want your application to perform. The NSOperation class itself is an abstract base class that must be subclassed in order to do any useful work.

NSOperation本身是一個抽象基類,如果要使用的時候應(yīng)該先繼承它而不能直接去實例化一個NSOperation娜搂。
Foundation framework提供兩個子類贿讹,NSInvocationOperation和NSBlockOperation苛坚。NSInvocationOperation不需要再繼承才能使用,可以方便我們以現(xiàn)有的方法來初始化一個operation。NSBlockOperation方便我們通過block初始化operation。

NSOperation特征:

  • NSOperation之間可以建立依賴關(guān)系

  • 可以改變operation的優(yōu)先級

  • 能夠通過取消操作停止operation

  • 有可選的operation block,當主任務(wù)完成后

  • KVO監(jiān)聽狀態(tài)

NSInvocationOperation & NSBlockOperation例子

- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.operation = [self taskWithData:@"just test"];

[self.operation start];

NSBlockOperation *blockTest = [NSBlockOperation blockOperationWithBlock:^{
    NSLog(@"block is comeing");
}];

[blockTest addExecutionBlock:^{
    NSLog(@"blocke 2 is coming");
}];

[blockTest addExecutionBlock:^{
    NSLog(@"blocke 3 is coming");
}];

[blockTest start];}

- (NSOperation *)taskWithData:(id)data{
NSInvocationOperation *invoTest = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(handleData:) object:data];

return invoTest;
}

- (void)handleData:(id) data
{
NSLog(@"my data");
NSLog(@"%@", data);
}

自定義的NSOperation

至少要實現(xiàn)兩個方法:

  1. A custom initialization method(初始化的方法)
  2. main

簡單實現(xiàn)代碼:

@implementation MyOperation

- (instancetype)initWithData:(id) data
{
    if (self = [super init]) {
        self.myData = data;
        [self completeOperation];
      }
    return self;
}



- (void)main
{
     @try {
         NSLog(@"my operation is coming");
         NSLog(@"%@", _myData);
      }
     @catch (NSException *exception) {
         NSLog(@"%@", exception);
     }
     @finally {
         NSLog(@"finally");
     }
}

@end

在ViewController里面實例化

MyOperation *myOperation = [[MyOperation alloc] initWithData:@"my opeation"];
[myOperation start];

并發(fā)的NSOperation需要實現(xiàn)以下方法:

- (BOOL)isConcurrent
{
return YES;
}

- (BOOL)isExecuting {
return executing;
}

- (BOOL)isFinished {
return finished;
}

- (void)start{

if([self isCancelled])
{
    [self willChangeValueForKey:@"isFinished"];
    finished = YES;
    [self didChangeValueForKey:@"isFinished"];
    return;
}

[self willChangeValueForKey:@"isExecuting"];
[NSThread detachNewThreadSelector:@selector(main) toTarget:self withObject:nil];
executing = YES;
[self didChangeValueForKey:@"isExecuting"];
}

- (void)completeOperation {
[self willChangeValueForKey:@"isFinished"];
[self willChangeValueForKey:@"isExecuting"];

executing = NO;
finished = YES;

[self didChangeValueForKey:@"isExecuting"];
[self didChangeValueForKey:@"isFinished"];
}

Operation中支持KVO的屬性

isCancelled
isConcurrent
isExecuting
isFinished
isReady
dependencies
queuePriority
completionBlock

NSOperationQueue

兩種初始化的方法:

NSOperationQueue *myQueue1 = [[NSOperationQueue alloc] init];
NSOperationQueue *myQueue2 = [NSOperationQueue mainQueue];//mainQueue

[myQueue1 addOperation:myOperation];
[myQueue1 addOperation:self.operation];
[myQueue1 addOperation:blockTest];
  1. NSOperationQueue有優(yōu)先級的概念粥喜,因此是不支持FIFO的
  2. NSOperationQueue是并發(fā)執(zhí)行的,但是可以通過maxConcurrentOperationCount來設(shè)置并發(fā)的數(shù)量

NSOperation相對于GCD的優(yōu)勢

  1. 可以取消某個操作橘券。調(diào)用cancel方法可以取消操作,但是開始的任務(wù)是無法取消的额湘。而GCD是fire and forget模式。

  2. 指定操作間的依賴關(guān)系旁舰,指定特定的任務(wù)必須在某個任務(wù)完成后執(zhí)行锋华。

  3. 可以通過KVO監(jiān)控NSOperation對象的屬性。通過KVO就可以在何時結(jié)束何時掛起獲得通知鬓梅,進而做一些處理

  4. 指定操作間的優(yōu)先級供置。GCD的優(yōu)先級是針對整個隊列來說的,操作隊列就能比較方便的實現(xiàn)優(yōu)先級操作

  5. 重用NSOperation對象绽快。

參考

  1. 《Effective Objective-C 2.0》
  2. 《Concurrency Programming Guide》
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末芥丧,一起剝皮案震驚了整個濱河市紧阔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌续担,老刑警劉巖擅耽,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異物遇,居然都是意外死亡乖仇,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進店門询兴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來乃沙,“玉大人,你說我怎么就攤上這事诗舰【澹” “怎么了?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵眶根,是天一觀的道長蜀铲。 經(jīng)常有香客問我,道長属百,這世上最難降的妖魔是什么记劝? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮族扰,結(jié)果婚禮上厌丑,老公的妹妹穿的比我還像新娘。我一直安慰自己渔呵,他們只是感情好蹄衷,可當我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著厘肮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪睦番。 梳的紋絲不亂的頭發(fā)上类茂,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天,我揣著相機與錄音托嚣,去河邊找鬼巩检。 笑死,一個胖子當著我的面吹牛示启,可吹牛的內(nèi)容都是我干的兢哭。 我是一名探鬼主播,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼夫嗓,長吁一口氣:“原來是場噩夢啊……” “哼迟螺!你這毒婦竟也來了冲秽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤矩父,失蹤者是張志新(化名)和其女友劉穎锉桑,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體窍株,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡民轴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了球订。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片后裸。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖冒滩,靈堂內(nèi)的尸體忽然破棺而出微驶,到底是詐尸還是另有隱情,我是刑警寧澤旦部,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布祈搜,位于F島的核電站,受9級特大地震影響士八,放射性物質(zhì)發(fā)生泄漏容燕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一婚度、第九天 我趴在偏房一處隱蔽的房頂上張望蘸秘。 院中可真熱鬧,春花似錦蝗茁、人聲如沸醋虏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽颈嚼。三九已至,卻和暖如春饭寺,著一層夾襖步出監(jiān)牢的瞬間阻课,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工艰匙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留限煞,地道東北人。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓员凝,卻偏偏與公主長得像署驻,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內(nèi)容

  • Mac OS X 10.6及iOS4.0之后導入了可以使全體線程更高效運行旺上,并且使并行處理應(yīng)用更易開發(fā)的架構(gòu)瓶蚂,GC...
    怎樣m閱讀 3,880評論 1 9
  • 和GCD的對比 操作隊列,比GCD更早抚官,GCD在設(shè)計上很多都是基于操作隊列的原理構(gòu)建的迹鹅。在iOS4之后檐蚜,操作隊列的...
    doudo閱讀 187評論 0 0
  • 1. NSOperation簡介 在某些情況下,執(zhí)行后臺任務(wù)GCD不一定是最好的方式,還有一種技術(shù)叫做操作隊列NS...
    Claire_wu閱讀 1,049評論 0 0
  • NSOperation NSOperation類是用來封裝在單個任務(wù)相關(guān)的代碼和數(shù)據(jù)的抽象類贴硫。NSOperatio...
    進無盡閱讀 969評論 0 6
  • 一茅糜、NSOperation介紹:基本語法 NSOperation在iOS4后也基于GCD實現(xiàn)熟嫩,但是相對于GCD來說...
    emily_sky閱讀 272評論 0 0