Translate

bloggerads內文

2017年12月1日 星期五

IOS-淺談NSOperation 和 Dispatch Queues 的區別

前言:相信在開發過程中應該都會碰到一些需要多工的情況,例如從web上下載圖片或資料,但又要操作當前的元件的行為或動作,這時會有延遲鈍鈍的行為,造成使用者體驗變差,
這時候多執行緒就是很好的方法了,透過GCD所提供的函數來撰寫,GCD是一個低階的C函數,他將程式碼封裝到一個block區段,然後再將這個block區段,放到所指定的佇列中,接下來就稍微來做個紀錄吧.

1.佇列(Dispatch Queues) 分3類

1.1 Main佇列:每個應用程式只會有一個main佇列,也是個預設的佇列,程式碼只會在同一個執行緒裡按照FIFO依序執行,main佇列只能夠過dispatch_async()函數將block區段中的程式碼放置佇列中,其方法為dispatch_get_main_queue().

範例:



補充:

如果使用同步的dispatch_sync會發生什麼事情呢?

例:



像這情況會照程卡死,因為我們已經在主程式了,因此可以使用isMainThread來做判斷





1.2 Concurrent佇列:每個App都有4種優先順序的Concurrent佇列,使用dispatch_get_global_queue().

範例:



1.3 Serial佇列:又稱private,因為是我們自己建立的佇列,建立時給個為一個識別碼,使用dispatch_queue_create()建立serial佇列

範例:


PS:處理1及處理2會同時執行.


那麼回到一開始的問題,那要完成多執行緒要怎麼使用呢,只要我們結合Main及Concurrent就可以了,如範例所示:













2.NSOperation 分2類

NSOperation是一個抽象的類別,不能夠直接使用它,必須使用子類別才行

1.分別有以下2類 :

  • NSBlockOperation 主要是用來將程式封裝成block區段
  • NSInvocationOperation 主要用來執行指定某個函數

2.使用NSOperation的優點:

提供了任務的狀態:isExecuteing, isFinished, 可以很方便的取消一個NSOperation的執行
可以更容易的添加任務的依賴關係
  • 提供了任務的狀態:isExecuteing, isFinished, 可以很方便的取消一個NSOperation的執行
  • 可以更容易的添加任務的依賴關係
3.範例:

3.1 多執行緒處理




3.2 依賴




結論:其實2種設計方法都很好,主要可以多一些解決問題的辦法,我認為 Dispatch Queues 因好維護,因此比較多人使用.

終於打完...(攤...QQ





沒有留言:

張貼留言