進階篇第三期:繼承NSOperation

來源:互聯網
上載者:User

標籤:ios


本期我們來介紹如何繼承NSOperation來實現Operation的並發與串列


在中級篇裡面我已經為大家介紹了,關於NSOperation的兩個系統類別的使用,沒錯,很簡單,下面我們就來推進以下繼承NSOperation,自訂實現它的子類該如何?呢


下面分為並發與串列,兩種


並發:說白了,就是幾個線程,共同開始,不一定共同結束

串列:說白了,就是幾個線程,一個一個有順序的執行


先來自訂一個串列的吧,我叫它NotConcurrenceOperation

自訂這個類以後,我們只要重寫它的main方法就可以了

先為它添加一個初始化方法吧


 - (id)initWithUrlString:(NSString *)urlString {    if (self = [super init]) {        self.urlString = urlString;    }    return self;} - (void)main {    // 建立一個自動釋放池,如果是非同步執行操作,那麼將無法訪問到主線程的自動釋放池    @autoreleasepool {        if (self.isCancelled) {            return;        }                NSURL *urlString = [NSURL URLWithString:self.urlString];        NSData *dataString = [NSData dataWithContentsOfURL:urlString];                if (self.isCancelled) {            return;        }                NSLog(@"%@", dataString);    }}


大家看到我在main方法裡面手動建立了一個自動釋放池,沒錯,雖然是ARC,但是我們還是會經常用到自動釋放池來管理記憶體,就像代碼裡面寫的注釋一樣,所以我們要手動加一個,聽說RunLoop裡面也有對應的方法,有時間,我也參考學習一下,在這裡就不做過多的解釋


另外我們在好多地方都有用到if語句來判斷當前線程的狀態,沒錯,這裡也就是當我們取消操作的時候,我們要把它直接跳出Main方法


然後接下來我們看一看用代碼如何建立一個並發的NSOperation


這時自訂一個並發的吧,我叫它ConcurrenceOperation


那我們在這裡要重寫幾個方法,就不用重寫main方法了哦


  - (void)start {    //這裡面我們來叫用作業需要處理的事情}- (BOOL)isConcurrent {    return YES;}- (BOOL)isExecuting {    return YES;}- (BOOL)isFinished {    return YES;}


其實還是蠻簡單的,只不過需要我們手動的去重寫一部分方法罷了


就這樣,兩個類建立好了,那麼接下來我們來玩有意思的事情哦


     for (int i = 0; i < 5; i++) {        NotConcurrenceOperation *notConcurrenceOperation = [[NotConcurrenceOperation alloc] initWithUrlString:@"http://www.baidu.com" withDelegate:self];        notConcurrenceOperation.name = [NSString stringWithFormat:@"%d", i];        notConcurrenceOperation.delegate = self;        [notConcurrenceOperation start];    }


調用這個方法以後,我們會再對應的協議返回來的資料中看到一個奇怪的事情

沒錯,就是它們5個操作的執行是串列的,也就是非並發的


再來看下面的程式碼片段


     for (int i = 0; i < 5; i++) {        ConcurrenceOperation *concurrenceOperation = [[ConcurrenceOperation alloc] initWithURLString:@"http://www.baidu.com"];        concurrenceOperation.name = [NSString stringWithFormat:@"%d", i];        concurrenceOperation.delegate = self;        [concurrenceOperation start];    }


調用這個方法以後呢,你也會驚奇的發現,果然不一樣了哦,果然是並發的有木有



如果你真的有跟著這期的內容一起研究、探討、動動手


你會發現:真的有好多好多有意思、有趣的事情哦,代碼真的很好玩,裡面的世界讓人琢磨不透



那麼我也只是寫了部分主要的代碼,這個過程還是要大家動手去完成的,它會鞏固你的知識,也會讓你在實踐的時候發現更多的秘密,如果有技術上的秘密,記得來分享哦




歡迎小夥伴們來做補充,有相關問題都可以來技術交流群裡面找我





本文出自 “東軟iOS校友群的技術部落格” 部落格,請務必保留此出處http://neusoftios.blog.51cto.com/9977509/1626175

進階篇第三期:繼承NSOperation

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.