iOS開發(fā) 自定義NSOPeration

iOS多線程開發(fā)中碎节,NSOperation是我們經常使用的捧搞,有時系統(tǒng)自帶的兩個類NSInvocationOperation和NSBlockOperation不能滿足我們的需求時就需要我們自定義。
自定義NSOperation分兩種狮荔,一種是自定義非并發(fā)的NSOperation胎撇,一種是定義并發(fā)的NSOperation的。下面分別介紹殖氏。
一:定義非并發(fā)的NSOperation晚树。
定義非并發(fā)的NSOperation的比較簡單:
1.實現main方法,在main方法中執(zhí)行自定義的任務
2.正確的響應取消事件
具體代碼如下:
在ZCNoCurrentOperation.h文件中:

//  ZCNoCurrentOperation.h  
//  自定義非并發(fā)NSOPeration  
//  Created by MrZhao on 16/9/13.  
//  Copyright ? 2016年 MrZhao. All rights reserved.  
/* 
*自定義非并發(fā)的NSOperation步驟:1.實現main方法雅采,在main方法中執(zhí)行自定義的任務 
 2.正確的響應取消事件 
*/    
#import <Foundation/Foundation.h> 
@interface ZCNoCurrentOperation : NSOperation  
@end  

在ZCNoCurrentOperation.m中要注意兩點1.創(chuàng)建釋放池爵憎,2.正確相應取消事件。

//  ZCNoCurrentOperation.m  
//  自定義非并發(fā)NSOPeration  
//  
//  Created by MrZhao on 16/9/13.  
//  Copyright ? 2016年 MrZhao. All rights reserved.  
#import "ZCNoCurrentOperation.h"  
@implementation ZCNoCurrentOperation  
/*自定義main方法執(zhí)行你的任務*/  
- (void)main {  
    //捕獲異常  
    @try {  
        //在這里我們要創(chuàng)建自己的釋放池婚瓜,因為這里我們拿不到主線程的釋放池  
        @autoreleasepool {  
            BOOL isDone = NO;  
            //正確的響應取消事件  
            while(![self isCancelled] && !isDone)  
            {  
                //在這里執(zhí)行自己的任務操作  
                NSLog(@"執(zhí)行自定義非并發(fā)NSOperation");  
                NSThread *thread = [NSThread currentThread];  
                NSLog(@"%@",thread);  
                  
                //任務執(zhí)行完成后將isDone設為YES  
                isDone = YES;  
            }  
        }     
    }  
    @catch (NSException *exception) {      
    }       
} 
@end 

我們在ViewDidLoad函數中使用我們自定義的operation,并調用start方法

(void)viewDidLoad {  
   [super viewDidLoad];  
   ZCNoCurrentOperation *operation1 = [[ZCNoCurrentOperation alloc] init];  
   //默認情況下宝鼓,該operati  
   [operation1 start];
}

打印結果如下:

20160913161731455.png

默認情況下,該operation在當前調用start的線程中執(zhí)行.其實如果我們創(chuàng)建多個自定義的ZCNoCurrentOperation巴刻,并放入NSOperationQueue中愚铡,這些任務也是并發(fā)執(zhí)行的,只不過因為我們沒有處理并發(fā)情況下胡陪,線程執(zhí)行完沥寥,KVO等操作,因此不建議在只實現main函數的情況下將其加入NSOperationQueue柠座,只實現main一般只適合自定義非并發(fā)的邑雅。

#import "ViewController.h"  
#import "ZCNoCurrentOperation.h"  
@interface ViewController ()  
@property(nonatomic,strong)NSOperationQueue *myQueue;  
@end  
@implementation ViewController  
- (void)viewDidLoad {  
    [super viewDidLoad];  
    self.myQueue = [[NSOperationQueue alloc] init];  
    ZCNoCurrentOperation *operation1 = [[ZCNoCurrentOperation alloc] init];  
    [self.myQueue addOperation:operation1];  
    ZCNoCurrentOperation *operation2 = [[ZCNoCurrentOperation alloc] init];  
    [self.myQueue addOperation:operation2];  
    ZCNoCurrentOperation *operation3 = [[ZCNoCurrentOperation alloc] init];  
    [self.myQueue addOperation:operation3];  
}  
@end 
20160913163205563.png

二:自定義并發(fā)的NSOperation
自定義并發(fā)的NSOperation需要以下步驟:
1.start方法:該方法必須實現,
2.main:該方法可選妈经,如果你在start方法中定義了你的任務蒂阱,則這個方法就可以不實現锻全,但通常為了代碼邏輯清晰,通常會在該方法中定 義自己的任務
3.isExecuting isFinished 主要作用是在線程狀態(tài)改變時录煤,產生適當的KVO通知
4.isConcurrent :必須覆蓋并返回YES;
下面給出代碼:
在ZCCurrentOperation.h中

//  ZCCurrentOperation.h  
//  自定義非并發(fā)NSOPeration  
//  Created by MrZhao on 16/9/13.  
//  Copyright ? 2016年 MrZhao. All rights reserved.  
/* 
 *自定義并發(fā)的NSOperation需要以下步驟: 
 1.start方法:該方法必須實現鳄厌, 
 2.main:該方法可選,如果你在start方法中定義了你的任務妈踊,則這個方法就可以不實現了嚎,但通常為了代碼邏輯清晰,通常會在該方法中定義自己的任務 
 3.isExecuting  isFinished 主要作用是在線程狀態(tài)改變時廊营,產生適當的KVO通知 
 4.isConcurrent :必須覆蓋并返回YES; 
 */  
#import <Foundation/Foundation.h>  
@interface ZCCurrentOperation : NSOperation {  
    BOOL executing;  
    BOOL finished;  
}  
@end  

在ZCCurrentOperation.m中

//  ZCCurrentOperation.m  
//  自定義非并發(fā)NSOPeration  
//  Created by MrZhao on 16/9/13.  
//  Copyright ? 2016年 MrZhao. All rights reserved.  
#import "ZCCurrentOperation.h"  
@implementation ZCCurrentOperation  
- (id)init {  
    if(self = [super init])  
    {  
        executing = NO;  
        finished = NO;  
    }  
    return self;  
}  
- (BOOL)isConcurrent {  
    return YES;  
}  
- (BOOL)isExecuting {    
    return executing;  
}  
- (BOOL)isFinished {  
    return finished;  
}  
- (void)start {  
    //第一步就要檢測是否被取消了歪泳,如果取消了,要實現相應的KVO  
    if ([self isCancelled]) {  
        [self willChangeValueForKey:@"isFinished"];  
        finished = YES;  
        [self didChangeValueForKey:@"isFinished"];  
        return;  
    }  
    //如果沒被取消露筒,開始執(zhí)行任務  
    [self willChangeValueForKey:@"isExecuting"];  
    [NSThread detachNewThreadSelector:@selector(main) toTarget:self withObject:nil];  
    executing = YES;  
    [self didChangeValueForKey:@"isExecuting"];  
}  
- (void)main {  
    @try {  
        @autoreleasepool {  
            //在這里定義自己的并發(fā)任務  
            NSLog(@"自定義并發(fā)操作NSOperation");  
            NSThread *thread = [NSThread currentThread];  
            NSLog(@"%@",thread);  
            //任務執(zhí)行完成后要實現相應的KVO  
            [self willChangeValueForKey:@"isFinished"];  
            [self willChangeValueForKey:@"isExecuting"];  
            executing = NO;  
            finished = YES;  
            [self didChangeValueForKey:@"isExecuting"];  
            [self didChangeValueForKey:@"isFinished"];  
        }  
    }     
    }   
}  
@end  

我們來測試一下:

//  ViewController.m  
//  自定義并發(fā)NSOperation  
//  
//  Created by MrZhao on 16/9/13.  
//  Copyright ? 2016年 MrZhao. All rights reserved.  
#import "ViewController.h"  
#import "ZCCurrentOperation.h"  
@interface ViewController ()  
@property (nonatomic,strong)NSOperationQueue *myQueue;  
@implementation ViewController  
- (void)viewDidLoad {  
    [super viewDidLoad];  
    self.myQueue = [[NSOperationQueue alloc] init];  
    ZCCurrentOperation *operation1 = [[ZCCurrentOperation alloc] init];  
    ZCCurrentOperation *operation2 = [[ZCCurrentOperation alloc] init];  
    [self.myQueue addOperation:operation2];  

    ZCCurrentOperation *operation3 = [[ZCCurrentOperation alloc] init];  
    [self.myQueue addOperation:operation3];  
}  
@end
20160913180613489.png

以上就是實現自定義NSOperation的相關內容呐伞,下面章節(jié)會給出一個具體的應用實例。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末慎式,一起剝皮案震驚了整個濱河市伶氢,隨后出現的幾起案子,更是在濱河造成了極大的恐慌瘪吏,老刑警劉巖癣防,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異掌眠,居然都是意外死亡蕾盯,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門蓝丙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來级遭,“玉大人,你說我怎么就攤上這事渺尘∽俺” “怎么了?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵沧烈,是天一觀的道長掠兄。 經常有香客問我,道長锌雀,這世上最難降的妖魔是什么蚂夕? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮腋逆,結果婚禮上婿牍,老公的妹妹穿的比我還像新娘。我一直安慰自己惩歉,他們只是感情好等脂,可當我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布俏蛮。 她就那樣靜靜地躺著,像睡著了一般上遥。 火紅的嫁衣襯著肌膚如雪搏屑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天粉楚,我揣著相機與錄音辣恋,去河邊找鬼。 笑死模软,一個胖子當著我的面吹牛伟骨,可吹牛的內容都是我干的。 我是一名探鬼主播燃异,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼携狭,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了回俐?” 一聲冷哼從身側響起逛腿,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鲫剿,沒想到半個月后鳄逾,有當地人在樹林里發(fā)現了一具尸體稻轨,經...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡灵莲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了殴俱。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片政冻。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖线欲,靈堂內的尸體忽然破棺而出明场,到底是詐尸還是另有隱情,我是刑警寧澤李丰,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布苦锨,位于F島的核電站,受9級特大地震影響趴泌,放射性物質發(fā)生泄漏舟舒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一嗜憔、第九天 我趴在偏房一處隱蔽的房頂上張望秃励。 院中可真熱鬧,春花似錦吉捶、人聲如沸薯鳍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蛮穿。三九已至,卻和暖如春涂臣,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工砌们, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人搁进。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓浪感,卻偏偏與公主長得像,于是被迫代替她去往敵國和親饼问。 傳聞我的和親對象是個殘疾皇子影兽,可洞房花燭夜當晚...
    茶點故事閱讀 44,689評論 2 354

推薦閱讀更多精彩內容