標籤: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