iOS多執行緒小結( NSOperation)
一) NSOperation使用方法:
NSOperation 例項封裝了需要執行的操作和執行操作所需的資料,並且能夠以併發或非併發的方式執行這個操作。NSOperation在ios4後也基於GCD實現,但是相對於GCD來說可控性更強,並且可以加入操作依賴。NSOperation提供了ready, cancelled, executing, finished這幾個狀態變化,我們的開發也是必須處理自己關心的其中的狀態。這些狀態都是基於keypath的KVO通知決定,所以在你手動改變自己關心的狀態時,請別忘了手動傳送通知。這裡面每個屬性都是相互獨立的,同時只可能有一個狀態是YES。finished這個狀態在操作完成後請及時設定為YES,因為NSOperationQueue所管理的佇列中,只有isFinished為YES時才將其移除佇列,這點在記憶體管理和避免死鎖很關鍵。
1.NSInvocationOperation:
NSInvocationOperation *op = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(download:) object:nil];
[op start];
//開始
[op cancel];
//取消
2 NSBlockOperation
NSBlockOperation *block = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"%@" ,[NSThread currentThread]); //處理執行緒的block方法
}];
3 NSOperationQueue
一個NSOperation物件可以通過呼叫start方法來執行任務,預設是同步執行的。也可以將NSOperation新增到一個NSOperationQueue(操作佇列)中去執行,而且是非同步執行的。一旦NSoperation新增到NSoperationQueue中,使用者就無權對NSoperation管理,都有NSoperationQueue來執行。
3.1 新增一個佇列
NSoperationQueue *myQueue = [[NSOperationQueue alloc]init];
NSInvocationOperation *op = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(download:) object:nil];
[myQueue addOperation:op];
3.2 主佇列(任何重新整理UI的方法都必須在主佇列中執行)
[[NSOperationQueue mainQueue]addOperationWithBlock:^{
//可以執行重新整理UI控制元件的方法
}];
3.3 佇列直接可以設定依賴,比如佇列1需要佇列2執行完畢後才能執行(addDependency)
NSBlockOperation *block1 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"%@",[NSThread currentThread]);
}];
NSBlockOperation *block2 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"%@",[NSThread currentThread]);
}];
[block1 addDependency:block2];
[myQueue addOperation:block1];
[myQueue addOperation:block2];
3.4可以設定最大併發的運算元量
[myQueue setMaxConcurrentOperationCount:2];
3.5 一旦新增到佇列,佇列就擁有了這個Operation物件並且不能被 刪除,唯一能做的事情是取消。
[myQueue cancelAllOperations];
3.6獲取NSOperation
myQueue.operations 這是一個數組,裡面存放這新增進入這個佇列的所有任務
3.7 如果你想臨時暫停Operations的執行,可以使用queue的setSuspended:方法暫停queue。
[myQueue setSuspended:YES];
相關推薦
iOS多執行緒小結( NSOperation)
一) NSOperation使用方法: NSOperation 例項封裝了需要執行的操作和執行操作所需的資料,並且能夠以併發或非併發的方式執行這個操作。NSOperation在ios4後也基於GCD實現,但是相對於GCD來說可控性更強,並且可以加入操作依賴。N
iOS多執行緒程式設計(四)------ GCD(Grand Central Dispatch)
一、簡介 是基於C語言開發的一套多執行緒開發機制,也是目前蘋果官方推薦的多執行緒開發方法,用起來也最簡單,只是它基於C語言開發,並不像NSOperation是面向物件的開發,而是完全面向過程的。如果使用GCD,完全由系統管理執行緒,我們不需要編
ios多執行緒操作(六)—— GCD全域性佇列與主佇列
我們都應該清楚,同步任務有一個特性,只要一新增到佇列中就要馬上執行,主佇列中永遠就只要一條執行緒——主執行緒,此時主執行緒在等待著主佇列排程同步任務,而主佇列發現主執行緒上還有任務未執行完,就不會讓同步任務新增到主執行緒上,由此就造成了互相等待(主佇列在等待主執行緒執行完已有的任務,而主執行緒又在等
ios多執行緒操作(十二)—— 自定義NSOperation實現網路下載後回撥
- (void)main { @autoreleasepool { // 下載圖片的耗時操作 NSURL *url = [NSURL URLWithString:self.urlString]; NSData *data = [NSDa
iOS多執行緒學習之NSOperation(一)
什麼是NSOperation呢?有什麼用呢?和GCD相比有什麼不同呢?或者優勢呢? NSOperation底層實現是基於GCD的,比GCD多了一些簡單使用的功能,使用更加面向物件 作用:配合使用NSOperation 和 NSOperationQueue也能實現多執行緒
iOS多執行緒筆記(GCD理解)
0x00 先上腦圖 0x01 iOS的三種多執行緒技術 1.NSThread 每個NSThread物件對應一個執行緒,量級較輕(真正的多執行緒)2.以下兩點是蘋果專門開發的“併發”技術,使得程式設計師可以不再去關心執行緒的具體使用問題ØNSOperation/NSOperationQueue 面向物件的
ios多執行緒——鎖(解決多執行緒搶奪同一塊資源的問題)
在iOS中有幾種方法來解決多執行緒訪問同一個記憶體地址的互斥同步問題: 方法一,@synchronized(id anObject),(最簡單的方法) 會自動對引數物件加鎖,保證臨界區內的程式碼執行緒
多執行緒學習(1)
優點:多程序,多執行緒可以讓程式不被阻塞.可以充分利用多核cpu的優勢,提高執行效率 建立方式: (1)通過繼承Thread類,並重寫其中的run方法來出建立 Thread t = new Thread() { public void run() { // 執行 //
多執行緒學習(七)
問題 1.賣票系統(如果每個執行緒執行的程式碼相同,可以使用同一個Runnable物件,這個Runnable物件中有那個共享資料) 解決 public class MultiThreadShareDataStudy { public static void main(String
java多執行緒知識(1)
基礎概念 1.執行緒和程序: 程序有自己的獨立空間,而執行緒共享程序的空間 執行緒通訊方便,同一程序的執行緒共享全域性變數,靜態資料 多程序更健壯,多執行緒只要有一個執行緒死掉,整個程序也死 2.同步和非同步:同步必須等該方法的呼叫返回 3.並行和
java多執行緒之(二)鎖
一,鎖 在物件的建立時java會為每個object物件分配一個monitor( 監視器或者監視鎖),當某個物件的同步方法(synchronized methods )被多個執行緒呼叫時,該物件的monitor將負責處理這些訪問的併發獨佔要求。 當一個執行緒呼叫一個物件的同步方法時(sy
多執行緒基礎(三)-多執行緒併發安全問題
多執行緒基礎(三)-多執行緒併發安全問題 當多個執行緒併發操作同一資源時,由於執行緒切換實際不可控會導致操作邏輯執行順序出現混亂,嚴重時會導致系統癱瘓。例如下面的程式碼 public class SyncDemo { public static void main(Strin
java多執行緒系列(一):Thread、Runnable、Callable實現多執行緒的區別
實現多執行緒 java實現多執行緒的方法有三種,分別是繼承thread類,實現runnable介面,實現callable介面(call方法有返回值) /** * 繼承Thread */ public class MyThread extends Thread{ int a = 0;
java多執行緒-初探(一)
啥是多執行緒?跟程序又是啥關係? 比方說:我去洗手,洗完手去吃飯。 程序(Processor) 洗手跟吃飯是兩個程序。 執行緒(Thread) 在洗手的程序裡,我同時聽歌,還唱歌。那這裡洗手是一個程序,聽歌跟唱歌是兩個執行緒。 在吃飯的程序裡,我同時聽歌,還
Java多執行緒學習(十):AQS 原理以及 AQS 同步元件總結
常見問題:AQS 原理?;CountDownLatch和CyclicBarrier瞭解嗎,兩者的區別是什麼?用過Semaphore嗎? 本節思維導圖: 阿里雲產品 1888 代金券領取:https://promotion.aliyun.com/ntms
Java多執行緒學習(九)JUC 中的 Atomic 原子類總結
阿里雲產品 1888 代金券領取:https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=hf47liqn 本節思維導圖: 1 Atomic 原子類介紹 Atomic 翻譯成中文是原
linux多執行緒入門(二)互斥量
當多個執行緒訪問一個共享的變數的時候是非常危險的,可能會拿到錯誤的資料或者程式崩潰! 所以為了安全的使用執行緒引入了互斥量的做法 兩個互斥量的函式為 pthread_mutex_lock(pthread_mutex_lock* lock) pthread_mutex_unlock(p
java多執行緒-初探(四)
java多執行緒-初探(三) 本文闡述經典的多執行緒生產者、消費者模型。 涉及執行緒等待、喚醒、死鎖以及常用的synchronized跟JDK5的Lock介面兩種方式的知識點。 生產者、消費者模型初步理解 生產者:負責給資源中儲存資料(資源)
java多執行緒-初探(三)
java多執行緒-初探(二) 本章主要闡述synchronized同步關鍵字,以及未做同步將出現的問題。 未做同步引發的問題舉例 本文舉例:1萬個人一起吃1萬碗飯,兩個人隨便吃。吃完為止。 正常想要的結果是:吃到第0碗的時候,程式執行結束,打印出剩
java多執行緒-初探(二)
java多執行緒-初探(一) 常見的執行緒函式 sleep 當前執行緒暫停 join 加入到當前執行緒中 setPriority 執行緒優先順序