日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

多线程-NSOperation

發(fā)布時(shí)間:2025/1/21 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 多线程-NSOperation 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

NSOperation

NSOperation的使用:

    NSOperation需要和和NSOperationQueue實(shí)現(xiàn)多線程編程

  實(shí)現(xiàn)的具體步驟:

  • 先將需要執(zhí)行的操作封裝到一個(gè)NSOperation對(duì)象中
  • 然后將NSOperation對(duì)象添加到NSOperationQueue中
  • 系統(tǒng)會(huì)自動(dòng)將NSOperationQueue中的NSOperation取出來
  • 將取出的NSOperation封裝的操作放到一條新線程中執(zhí)行
  • 注意:NSOperation是一個(gè)抽象類,不具備分裝操作的能力必須使用它的子類

    •   NSInvocationOperation
    •   NSBlockOperation
    •   自定義子類繼承NSOperation,實(shí)現(xiàn)內(nèi)部相應(yīng)的方法(-main方法)

    這里介紹一下上面提到的操作 想到于GCD中的隊(duì)列,封裝一些你要中的事情(任務(wù))

    NSOperation各個(gè)子類的基本使用:

      NSInvocationOperation

    ?

    -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {NSInvocationOperation *invovationOperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(task) object:nil];[invovationOperation start]; }- (void)task {NSLog(@"%@", [NSThread currentThread]); }

    ?

    輸出結(jié)果:

    2016-03-29 23:14:31.262 test1[1440:105145] <NSThread: 0x7fcba5101dc0>{number = 1, name = main}

    分析,說明使用NSInvocationOperation并不會(huì)開辟子線程執(zhí)行封裝的任務(wù),我們?cè)诳匆幌翹SBlockOperation

    ?

    NSBlockOperation的使用

    NSBlockOperation *blockOp = [NSBlockOperation blockOperationWithBlock:^{for (int i = 0; i<3; i++) {NSLog(@"A------%@", [NSThread currentThread]);};}];[blockOp start];

    輸出結(jié)果:

    2016-03-29 23:21:00.211 test1[1470:107920] A------<NSThread: 0x7fda63805010>{number = 1, name = main} 2016-03-29 23:21:00.212 test1[1470:107920] A------<NSThread: 0x7fda63805010>{number = 1, name = main} 2016-03-29 23:21:00.212 test1[1470:107920] A------<NSThread: 0x7fda63805010>{number = 1, name = main}

    分析得到結(jié)果:NSBlockOperation單獨(dú)使用也需要調(diào)用start方法,并且不會(huì)開辟子線程執(zhí)行任務(wù),但是我們看一下下面的情況,當(dāng)block追加操作的時(shí)候,追加的操作會(huì)在子線程中執(zhí)行并且是并發(fā)執(zhí)行的

    注意: 默認(rèn)情況下,調(diào)用了start方法后并不會(huì)開一條新線程去執(zhí)行操作,而是在當(dāng)前線程同步執(zhí)行操作 只有將NSOperation放到一個(gè)NSOperationQueue中,才會(huì)異步執(zhí)行操作 并且內(nèi)部會(huì)調(diào)用start方法 NSBlockOperation *blockOp = [NSBlockOperation blockOperationWithBlock:^{for (int i = 0; i<3; i++) {NSLog(@"A------%@", [NSThread currentThread]);};}]; /********************************blcokOperation追加任務(wù)********************************/[blockOp addExecutionBlock:^{for (int i = 0; i<3; i++) {NSLog(@"B------%@", [NSThread currentThread]);};}]; /********************************blcokOperation追加任務(wù)********************************/[blockOp addExecutionBlock:^{for (int i = 0; i<3; i++) {NSLog(@"C------%@", [NSThread currentThread]);};}];[blockOp start];

    輸出結(jié)果:

    2016-03-29 23:24:58.883 test1[1508:110154] A------<NSThread: 0x7fd3905062c0>{number = 1, name = main} 2016-03-29 23:24:58.883 test1[1508:110187] C------<NSThread: 0x7fd390700130>{number = 2, name = (null)} 2016-03-29 23:24:58.883 test1[1508:110186] B------<NSThread: 0x7fd3919b7290>{number = 3, name = (null)} 2016-03-29 23:24:58.883 test1[1508:110154] A------<NSThread: 0x7fd3905062c0>{number = 1, name = main} 2016-03-29 23:24:58.883 test1[1508:110154] A------<NSThread: 0x7fd3905062c0>{number = 1, name = main} 2016-03-29 23:24:58.883 test1[1508:110186] B------<NSThread: 0x7fd3919b7290>{number = 3, name = (null)} 2016-03-29 23:24:58.883 test1[1508:110187] C------<NSThread: 0x7fd390700130>{number = 2, name = (null)} 2016-03-29 23:24:58.884 test1[1508:110186] B------<NSThread: 0x7fd3919b7290>{number = 3, name = (null)} 2016-03-29 23:24:58.884 test1[1508:110187] C------<NSThread: 0x7fd390700130>{number = 2, name = (null)}

    ?

    注意:只要NSBlockOperation封裝的操作數(shù) > 1,就會(huì)異步執(zhí)行操作

    將操作添加進(jìn)NSOperationQueue的使用

    首先我們要靠接NSOperationQueue的兩種類型及創(chuàng)建方式

      

    NSOperationQueue *queue = [NSOperationQueue mainQueue];

    ?注意:通過mainQueue 創(chuàng)建的隊(duì)列中的任務(wù),不會(huì)創(chuàng)建子線程,在主隊(duì)列中執(zhí)行

    NSOperationQueue *queue = [[NSOperationQueue alloc] init];

    ?注意:通過alloc init的方式創(chuàng)建的隊(duì)列會(huì)開啟子線程執(zhí)行任務(wù),并且是并發(fā)執(zhí)行任務(wù)的,那么我們?cè)趺聪騁CD中那樣讓隊(duì)列中的任務(wù)串行執(zhí)行任務(wù)呢

    那么可以以通過線面的屬性來設(shè)置最大的并發(fā)數(shù) 當(dāng)值為1的時(shí)候,隊(duì)列會(huì)開啟子線程并且是串行執(zhí)行隊(duì)列中的任務(wù),在實(shí)際的開發(fā),建議一般創(chuàng)建最多子線程的條數(shù)為3~5

    queue.maxConcurrentOperationCount = 1;

    ?

    隊(duì)列的取消、暫停、恢復(fù)

    ?

    操作依賴

    ?

    操作的監(jiān)聽

    ?

    自定義NSOperation

    ?

    自定義NSOperation下載圖片思路 – 無沙盒緩存

        

    ?

    轉(zhuǎn)載于:https://www.cnblogs.com/mshong/p/5335399.html

    總結(jié)

    以上是生活随笔為你收集整理的多线程-NSOperation的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。