亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

iOS多線程實現4-NSOperation

2019-11-14 18:18:53
字體:
來源:轉載
供稿:網友

原文鏈接:http://www.49028c.com/mddblog/p/4816875.html

一、介紹

  NSOperation是一個抽象類,我們可以使用系統提供的子類或者自己實現它的子類,具有以下特性:

    a. 是OC語言中基于GCD(GCD詳解)的面向對象的封裝;

    b. 使用起來比GCD更加簡單(面向對象);

    c. 提供了一些用GCD不好實現的功能,比如可以取消在任務處理隊列中的任務,添加任務間的依賴關系等等;

    d. 蘋果推薦使用,使用NSOperation不用關心線程以及線程的生命周期;

    e. 可以指定操作之間的依賴關系,是將操作添加到隊列。

    f. 并發隊列,異步執行(多個線程,無序執行)。

  NSOperation方便統一管理,適用一些大型的復雜的場合,比如我們常用的網絡框架:AFNetworking、SDWebImage等等。

二、NSOperation子類

  NSOperation是一個抽象類,實現NSOperation子類的方式有3種:

    1) NSInvocationOperation:較少使用;

    2) NSBlockOperation:經常使用;

    3) 自定義子類繼承NSOperation,實現內部相應的方法:很少使用。

  我們要做的就是將以上3種操作的任意一種添加到NSOperationQueue來使用。

  1 NSInvocationOperation

  1)直接執行操作(同步)

 1 /// 點擊屏幕調用,創建一個操作并執行 2 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 3     NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(demo:) object:@"這是一個參數"]; 4     [operation start]; 5 } 6 /// 將參數與當前線程打印 7 - (void)demo:(NSString *)str { 8     NSLog(@"%@--%@",str,[NSThread currentThread]); 9 }10 11 打印結果:12 2015-09-17 15:11:54.030 NSOperationTest[2595:162235] 這是一個參數 <NSThread: 0x7fa759c173a0>{number = 1, name = main}

  第3行代碼創建初始化了一個NSInvocationOperation對象,并且根據一個對象(self)和selector來創建操作,第4行代碼執行操作demo:且傳遞了一個參數。默認情況下,調用了start方法后并不會開一條新線程去執行操作,而是在當前線程同步執行操作。只有將operation放到一個NSOperationQueue中,才會異步執行操作。

  2)將操作添加到NSOperationQueue執行

 1 /// 點擊屏幕調用,創建一個操作并執行 2 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 3     [self invocationTest]; 4 } 5 /// 將操作添加到隊列 6 - (void)invocationTest { 7     // 創建操作隊列 8     NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init]; 9     // 創建操作(最后的object參數是傳遞給selector方法的參數)10     NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(demo:) object:@"這是一個參數"];11     // 將操作添加到操作隊列12     [operationQueue addOperation:operation];13 }14 /// 將參數與當前線程打印15 - (void)demo:(NSString *)str {16     NSLog(@"%@--%@",str,[NSThread currentThread]);17 }18 19 /* 打印結果 */20 2015-09-17 15:36:23.777 NSOperationTest[2943:182362] 這是一個參數--<NSThread: 0x7ff68af15b00>{number = 2, name = (null)}

  根據打印結果,可以看出新開啟了一個線程執行操作,且是異步執行的。

  2 NSBlockOperation

  1)執行一個操作(同步)

NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^(){    NSLog(@"%@",[NSThread currentThread]);}];// 開始執行任務[operation start];執行結果:2015-09-17 15:47:58.791 NSOperationTest[3015:191317] <NSThread: 0x7fe6abd02b70>{number = 1, name = main}

  可以看到這種方法非常簡單,有點類似于GCD,它也是同步執行的。

  2)添加多個操作執行(異步)

// 初始化一個對象NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^(){    NSLog(@"1:%@",[NSThread currentThread]);}];// 再添加3操作[operation addExecutionBlock:^() {    NSLog(@"2:%@", [NSThread currentThread]);}];[operation addExecutionBlock:^() {    NSLog(@"3:%@", [NSThread currentThread]);}];[operation addExecutionBlock:^() {    NSLog(@"4:%@", [NSThread currentThread]);}];// 開始執行任務[operation start];執行結果:2015-09-17 15:55:48.372 NSOperationTest[3113:198447] 1:<NSThread: 0x7f9282f04e10>{number = 1, name = main}2015-09-17 15:55:48.372 NSOperationTest[3113:198530] 2:<NSThread: 0x7f9282e081c0>{number = 2, name = (null)}2015-09-17 15:55:48.372 NSOperationTest[3113:198532] 4:<NSThread: 0x7f9282c1a380>{number = 4, name = (null)}2015-09-17 15:55:48.372 NSOperationTest[3113:198533] 3:<NSThread: 0x7f9282e0ec90>{number = 3, name = (null)}

  當添加多個操作時,開啟新線程異步執行。

  3 自定義NSOperation

  自定義NSOperation最主要的就是重載-(void)main這個方法,在這個方法里面添加需要執行的操作。當執行這個操作時,系統會自動調用-(void)main這個方法。

#import "CustomOpertaionTest.h"@implementation CustomOpertaionTest- (void)main {    // 新建一個自動釋放池,避免內存泄露    @autoreleasepool {        // 執行的代碼        NSLog(@"這是一個測試:%@",[NSThread currentThread]);    }}@end

  在主控制器中調用,一共兩種:一種同步一種異步

/********************1.直接執行,同步***************/CustomOpertaionTest *operation = [[CustomOpertaionTest alloc] init];// 開始執行任務[operation start];執行結果:2015-09-17 16:24:27.620 NSOperationTest[3368:222036] 這是一個測試:<NSThread: 0x7ff420d28000>{number = 1, name = main}/********************2.添加到隊列,異步***************/NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init];CustomOpertaionTest *operation = [[CustomOpertaionTest alloc] init];[operationQueue addOperation:operation];執行結果:2015-09-17 16:27:13.594 NSOperationTest[3401:225178] 這是一個測試:<NSThread: 0x7ff2d0539d70>{number = 2, name = (null)}

三、其它常用方法

  1)取消操作,operation開始執行之后, 默認會一直執行操作直到完成,我們也可以調用cancel方法中途取消操作

[operation cancel];

  這里有一個問題,我們自定義的operation,如果支持取消,則應該在重載的main函數中查詢用戶是否取消了操作,特別是main函數中又循環的時候一定要查詢。然后釋放資源,退出main函數。

  2)如果想在一個NSOperation執行完畢后做一些事情

operation.completionBlock = ^() {    // 所有操作執行完成后執行};

  3)設置最大并發數,默認情況最大并發數為6,即同時最多只允許6個線程處于就緒態。

// 最大并發數為3[operationQueue setMaxConcurrentOperationCount:3];

  4)可以設置依賴來保證執行順序,?如一定要讓操作A執行完后,才能執行操作B,可以像下面這么寫:

[operationB addDependency:operationA]; 

  但是一定要注意不要A依賴B,然后B又依賴A,這樣A和B相互依賴造成都不能得到執行。如果A和B處于不同的操作隊列,也是可以設置依賴關系的。

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
在线电影欧美日韩一区二区私密| 国产欧美日韩亚洲精品| 久久久久久噜噜噜久久久精品| 欧美激情第6页| 成人97在线观看视频| 欧美洲成人男女午夜视频| 国产成人综合亚洲| 91精品久久久久久久久| 国产盗摄xxxx视频xxx69| 国产在线不卡精品| 国产精品久久久久久搜索| 国产精品1区2区在线观看| 中文字幕视频在线免费欧美日韩综合在线看| 久久久99免费视频| 久久精品在线视频| 色狠狠久久aa北条麻妃| 海角国产乱辈乱精品视频| 国产精品欧美久久久| 日韩h在线观看| 91精品国产高清久久久久久久久| 国产一区二区日韩| 在线观看欧美视频| 久久久人成影片一区二区三区| 国产精品丝袜视频| 狠狠干狠狠久久| 色哟哟入口国产精品| 青青在线视频一区二区三区| 国产精品国产福利国产秒拍| 久久精品成人欧美大片古装| 国产欧美日韩高清| 国产精品视频yy9099| 亚洲九九九在线观看| 亚洲精品一区av在线播放| 国产精品白丝av嫩草影院| 97人洗澡人人免费公开视频碰碰碰| 中文字幕亚洲在线| 久久99久久99精品免观看粉嫩| www.欧美精品一二三区| 日韩精品在线免费观看视频| 欧美极品少妇全裸体| 国产91在线播放九色快色| 国产人妖伪娘一区91| 欧美成人精品激情在线观看| 国产精品亚洲视频在线观看| 国产精品国内视频| 日韩精品一二三四区| 久久久中文字幕| 韩国v欧美v日本v亚洲| 成人性生交大片免费观看嘿嘿视频| 亚洲成**性毛茸茸| 欧美激情a在线| 国产脚交av在线一区二区| 欧美性xxxx18| 亚洲第一精品夜夜躁人人躁| 国产精品r级在线| 68精品久久久久久欧美| 久久久精品免费| 亚洲欧洲一区二区三区在线观看| 欧美夜福利tv在线| 中文字幕在线日韩| 97视频在线观看成人| 78m国产成人精品视频| 中文字幕日本精品| 在线丨暗呦小u女国产精品| 麻豆一区二区在线观看| 欧美精品videos性欧美| 国产成人午夜视频网址| 欧美日韩国产中文字幕| 国产精品久久婷婷六月丁香| 在线性视频日韩欧美| 亚洲人成电影在线播放| 555www成人网| 少妇高潮久久久久久潘金莲| 国产精品999999| 九九热精品视频在线播放| 国产91在线视频| 亚洲最大av在线| 亚洲成av人片在线观看香蕉| 91国产在线精品| 国产在线日韩在线| 亚洲a∨日韩av高清在线观看| 亚洲伦理中文字幕| 九九热在线精品视频| 成人444kkkk在线观看| 久久亚洲精品一区二区| 91美女片黄在线观| 欧美超级免费视 在线| 亚洲片国产一区一级在线观看| 91po在线观看91精品国产性色| 亚洲一区二区久久久久久| 欧美精品一本久久男人的天堂| 欧美精品一区二区免费| 欧美成年人视频网站欧美| 亚洲一区美女视频在线观看免费| 97在线视频免费播放| 91九色视频导航| 成人av.网址在线网站| 日韩欧美中文第一页| 精品久久在线播放| 日韩av中文字幕在线| 伊人男人综合视频网| 欧美精品国产精品日韩精品| 日韩欧美大尺度| 91久久精品日日躁夜夜躁国产| 国产美女精彩久久| 国外成人在线直播| 日韩欧美在线观看| 欧美黄色片在线观看| 国产自产女人91一区在线观看| 自拍偷拍免费精品| 成人午夜高潮视频| 国产成人综合av| 国产亚洲免费的视频看| 国产成人在线视频| 精品美女久久久久久免费| 国产福利精品av综合导导航| 久久久久久亚洲| 色偷偷偷综合中文字幕;dd| 国产亚洲欧美日韩精品| 一区二区三区亚洲| 亚洲在线www| 亚洲人精选亚洲人成在线| 中文字幕亚洲一区二区三区| 深夜福利亚洲导航| 亚洲国产精品999| 91精品国产综合久久香蕉最新版| 欧美美最猛性xxxxxx| 91精品国产成人www| 91国自产精品中文字幕亚洲| 国产精品极品美女粉嫩高清在线| 欧美日韩国产麻豆| 久久久久久12| 日韩av免费看网站| 亚洲综合大片69999| 久久夜色精品国产亚洲aⅴ| 国产91精品不卡视频| 精品中文字幕在线2019| 日韩av在线免播放器| 欧美福利视频在线| 亚洲国产精品悠悠久久琪琪| 欧洲中文字幕国产精品| 神马国产精品影院av| 国产精欧美一区二区三区| 国产精品亚洲视频在线观看| 性欧美长视频免费观看不卡| 日韩欧美黄色动漫| 色妞一区二区三区| 欧美精品情趣视频| 午夜精品久久久久久久久久久久久| 亚洲自拍高清视频网站| 韩国三级电影久久久久久| 国产精品成av人在线视午夜片| 欧美老女人性生活| 91精品国产自产在线观看永久| 欧美成年人视频网站欧美| 国产精品99蜜臀久久不卡二区| 日韩欧美在线视频日韩欧美在线视频| 国产亚洲欧美另类中文| 国产视频精品自拍| 亚洲电影免费观看高清完整版| 日本精品视频在线播放| 欧美香蕉大胸在线视频观看| 伊人一区二区三区久久精品| 国产亚洲美女久久|