1、 GCD緩存
GCD中最重要的兩個東西 任務 和 隊列異步
任務就是一段代碼(用來緩存,下載,計算等操做) async
隊列從大的方面分爲兩個隊列:主隊列(串行隊列)和 本身建立的隊列(串行,和並行)spa
主隊列中:線程
在主隊列中不能開啓新的線程出來(因此同步和異步的效果是同樣的,可是按鈕會回彈上來,變成能夠點擊的樣子,可是實際點擊了也是無效的)3d
在主隊列中,不能執行同步的方法,主線程的方法執行完,纔會執行主線程方法裏的主線程方法,這樣就會兩個任務互相等待! 而異步就能夠把主任務暫時掛起,先執行完主線程的任務,而後在執行主線程的任務中的主線程任務code
在本身建立的隊列中blog
串行:遵循FIFO(先進先出原則)隊列
並行:也遵循FIFO原則,可是有所不一樣get
其中任務的執行又分紅兩種方式
同步執行:(sync) 同步執行只會在當前隊列的主線程中執行,並不會另開一個線程
異步執行:(async)異步執行則會另外開一個線程,並不會再主線程中執行
兩個特性決定了同步執行容易堵塞線程,並且當同步執行時,其餘的操做都不能進行
或者說同步執行他會阻塞當前線程要等待當前任務執行完纔會繼續往下執行,可是異步執行的話就會執行下去,不會阻塞線程
應該就是上述圖的樣子233
兩種隊列和兩種執行方式交叉共有4個形式
串行同步:在串行隊列的線程中執行任務,不執行完一個任務,不能繼續下一個任務(並且按鈕在任務完成之前是不會回彈成可點擊的樣子)
串行異步:在串行隊列中開啓一個子線程進行任務,在第一個任務執行完成以前,不能執行下一個任務,可是不會干擾啓動主線程的任務
並行同步:同步是不具有開,子線程的能力的,可是並行只有開起子線程的時候才能起做用,因此並行同步,沒有意義就像串行同步
並行異步: 能夠開啓多個子線程進行任務,而且不會干擾啓動主線程任務
這裏的不會干擾啓動主線程任務是由隊列的主線程是否執行任務來決定的。
//一個特殊的狀況
若是在並行隊列中一個異步執行的block中執行一個同步的方法,那麼這個同步不會阻塞主線程,可是他會等同步的block執行完之後,纔會往下執行下去,由於是並行隊列,因此能夠開啓一個子線程
由於比較難以理解,因此蘋果就本身封裝了一個類NSOperationQueue
//操做屬於模型層,不分主線程和子線程。 NSInvocationOperation *IO = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(downLoadImage) object:nil]; //操做須要添加到操做隊列裏面,操做隊列就會自動添加到子線程中(能夠開啓多條子線程來執行任務) //操做隊列只須要添加 操做進來,開啓多少條子線程不須要管,何時回收也不須要管,可是須要咱們人爲的建立操做,而且須要建立隊列。 NSOperationQueue *queue = [[NSOperationQueue alloc] init]; [queue addOperation:IO]; NSBlockOperation *BO = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"%@, %d",[NSThread currentThread], [NSThread isMainThread]); }]; [queue addOperation:BO];
相對於GCD,這個就比較好理解和管理了。