Lập trình iOS 7 – Lập trình đa nhiệm bằng GCD

Share:

Hôm nay mình sẽ giới thiệu với các bạn lập trình đa nhiệm bằng GCD trong iOS. Những ai quan tâm hãy chia sẻ lên Mạng xã hội để nhiều người được biết đến hơn nhé. Mình cảm ơn.

Các cách trong lập trình đa nhiệm

  • Multi-thread programming
  • NSOperation -> Operation Queues
  • OpenCL
  • Dispatch Queues

Dispatch Queue

  • Multi-thread programming là lập trình đa nhiệm mức THẤP. Khi nó lỗi rất khó debug và không có nhiều API đơn giản cho lập trình viên
  • NSOperation là Objective-C lấy API của GCD Dispatch Queue
  • OpenCL sẽ đề cập sau vì nó khá mới
  • Trước mắt thì các bạn nên học GCD Dispatch Queue

Grand Central Dispatch

  • Dispatch Queue: danh sách hàng đợi của tác vụ được điều phối
  • Hiểu là nơi điều phối (dispatch) trung tâm (grand central)

Công nghệ liên quan đến GCD

Screen-Shot-2015-09-22-at-11.48.37-AM

Dispatch Queue vs Operation Queue

Screen-Shot-2015-09-22-at-11.49.32-AM

BLOCKS ^, khối tác vụ hay được sử dụng trong GCD

Screen-Shot-2015-09-22-at-11.50.28-AM

Khai báo block ở class implementation scope

Gọi ra giống như gọi hàm C bình thường
independentBlockObject();

__block để biến ngoài block có thể thay đổi được trong block

Screen-Shot-2015-09-22-at-11.52.19-AM

Có 2 loại block function

  • Một loại được khai báo phía ngoài bất kỳ hàm nào của lớp. Không thể truy xuất self hay ivar của lớp được
  • Loại kia được khai báo bên trong hàm của một lớp. Loại này truy xuất được self và ivar của lớp

Đặc điểm của block

  • Có thể được khai báo ở mức một lớp hay trong một hàm
  • Có thể khai báo như 1 kiểu
  • Block có thể gọi block (nested) hay thậm chí có thể gọi đệ quy (recursive)

Block còn được dùng để duyệt mảng

Các nhóm hàm API GCD

  • Queuing Task for Dispatch
  • Creating and managing queues
  • Managing Dispatch Objects
  • Using Dispatch Groups
  • Managing Dispatch Sources
  • Using Barriers
  • Using the Dispatch I/O channel API
  • Using the Dispatch I/O convenience API
  • Managing Time
  • Managing Dispatch Data Objects
  • Managing Queue-Specific Context Data

Creating and managing queues

  • dispatch_get_main_queue
  • dispatch_get_global_queue
  • dispatch_get_current_queue
  • dispatch_queue_create
  • dispatch_set_target_queue
  • dispatch_queue_get_label
  • dispatch_main

GCD thực thi block theo hai cách khác nhau trong hai kiểu hàng đợi

Queue – Hàng đợi block (khối tác vụ) có hai kiểu:

  • Serialized hay FIFO: Vào trước và ra trước
  • Concurrency: đồng thời

Hai cách thực thi block:

  • Asynchronous: đồng hành
  • Synchronous: độc hành

Main Dispatch Queue

Screen-Shot-2015-09-22-at-12.27.56-PM

Gọi block trên main thread

Di chuyển những tác vụ không liên quan tới giao diện và tương tác người dùng sang những thread Queue khác nhau để thread 1 sẽ luôn rảnh tay và sẵn sàng đáp ứng người dùng.

Serial Queue

Run từng tác vụ một lần lượt. Tại cùng 1 thời điểm thì mỗi tác vụ sẽ chạy trên 1 thread. Thread có thể khác nhau tùy vào sự điều phối của queue.

Có thể tạo được nhiều serial queue để nó cùng chạy đồng thời với nhau. Những tác vụ trong mỗi serial queue vẫn chạy lần lượt.

Screen-Shot-2015-09-22-at-12.32.53-PM Screen-Shot-2015-09-22-at-12.33.26-PM

 dispatch_sync khác gì với dispatch_async

  • dispatch_sync: độc hành
  • dispatch_async: đồng hành
  • Hãy thử dispatch_async và dispatch_sync với concurrency queue để thấy được kết quả khác biệt

dispatch_sync

  • dispatch_sync sẽ dừng thread phát ra lệnh dispatch cho đến lúc tác vụ được hoàn thành.
  • Tránh dispatch_sync trên main thread bởi nó sẽ khóa tạm thời mọi tương tác với users hoặc sẽ dừng không main thread để cập nhật giao diện

dispatch_barrier_async

Buộc mọi tác vụ trong concurrent queue phải thực hiện tuần tự giống như là đang chạy ở serial queue.

dispatch_group_async, dispatch_group_wait

dispatch_group_wait sẽ chờ cho tới khi tác vụ cuối cùng trong nhóm dispatch_group_async hoàn thành rồi mới chạy tiếp.

@synchronize

Screen-Shot-2015-09-22-at-12.36.29-PM

@synchronize để đảm bảo _secretStuff.name đọc ghi đúng

Screen-Shot-2015-09-22-at-12.37.20-PM

Lock khác @synchronize

  • [theLock unLock]
  • [theLock tryLock]
  • Nếu thử tryLock mà không thành công thì sẽ bỏ qua luôn mà không phải chờ như @synchronize

Giả lập trễ thời gian

Screen-Shot-2015-09-22-at-12.38.45-PM

Tác vụ thay đổi giao diện

  • Tác vụ chạy ở main thread hoàn toàn có thể thay đổi giao diện.
  • Tác vụ chạy ở thread khác, KHÔNG ĐƯỢC đổi giap diện bởi vì nó sẽ chen ngang các tác vụ khác ở main thread khiến cho app bị mất ổn định, crash, …

Screen-Shot-2015-09-22-at-12.39.52-PM Screen-Shot-2015-09-22-at-12.40.26-PM

Global Queue

Screen-Shot-2015-09-22-at-12.41.12-PM

Qua bài này các bạn đã tìm hiểu thêm kiến thức về đa nhiệm GCD. Cảm ơn đã theo dõi. Chúc các bạn học tốt!

Share:

Leave a reply