iOS Concurrency - Phần 1: Giới thiệu

Concurrency là một trong những vấn đề hóc búa trong mọi ngôn ngữ lập trình không riêng gì Swift. Nhiều developer gặp phải khó khăn khi tiếp cận nó và họ tránh né chúng khi xem xét giải pháp cho một vấn đề nào đó. Chúng ta phải thừa nhận rằng khi gặp một vấn đề mới, chúng ta luôn cảm thấy khó khăn khi tiếp cận. Tuy nhiên sau một thời gian nghiên cứu tìm tòi thì chúng ta lại cảm thấy nó dễ và không có gì. Điều này cũng giống như ngày xưa chúng ta mới tập chạy xe máy vậy. Ban đầu té lên, té xuống thẫm chí tắt máy loạn xạ đối với một số bạn tập chạy xe côn. Nhưng sau một thời gian rèn dũa chúng ta càng điêu luyện, nhuần nhuyễn hơn. Sau đây mình sẽ trả lời một số câu hỏi (Wh-question) mà mọi người hay thắc mắc khi nói về concurrency.

Concurrency nghĩa là gì? (What?)

Concurrency có nghĩa là nhiều hơn một task đang chạy cùng một lúc. Nếu cpu của device bạn có 1 core, bạn cũng có thể hiện thực concurrency. Bởi vì hệ điều hành sẽ chạy mỗi task cho một lượng nhỏ của milisecond và chuyễn đỗi giữa chúng. Thời gian chạy mỗi task quá ngắn làm chúng ta lầm tưởng rằng nhiều task đang chạy một lúc nhưng thực tế không phải vậy (fake multitaskinh). Tuy nhiên ipad và iphone đã có dual core vào năm 2011, do đó chúng ta có thể thật sự chạy nhiều task cùng một lúc.

Tại sao chúng ta phải sử dụng concurrency? (Why?)

Chúng ta sử dụng concurrency để làm cho user interface responsive. Một trong những vấn đề mà concurency giải quyết là một table view có chứa những hình ảnh lấy từ internet về sẽ không scroll mượt mà. Bằng cách sử dụng concurency chúng ta sẽ làm cho table view hiển thị những hình ảnh từ internet lên từng cell một các mượt mà hơn làm trại nghiệm người dùng tốt hơn. Một trong những lợi ích của concurrency là giúp chúng ta tối ưu được phần cứng của thiết bị. Ngày nay tất cả iOS devices đều có nhiều core, do đó cho phép những developers chạy nhiều task song song. Điều này không chỉ tối ưu mà còn lấy được những hiệu năng từ hardward. Bên cạnh đó còn có nhiều công dụng khác mà chúng ta sẽ tìm hiểu chi tiết trong những chủ đề dưới đây.

Chúng ta sử dụng concurrency như thế nào? (How?)

Khi cấu trúc app của bạn, chúng ta chỉ định những task nào cần chạy đồng thời. Những task sử dụng tài nguyên dùng chung (shared resource) sẽ không được chạy đồng thời vì sẽ gây ra sai lệch kết quả. Ngược lại những task truy suất những nguồn tài nguyên khác nhau có thể chạy đồng thời. Trong iOS, Apple cung cấp 2 cách để hiện thực concurrency: The Grand Central Dispatch (GCD) và NSOperationQueue frameworks. Chúng ta chỉ cần nói với GCD hoặc Operation những task nào cần chạy cùng một lúc và nó sẽ quản lý mọi thứ.

Nơi nào task chạy? (Where?)

Task được chạy trên thread. UI được chạy trên main thread và hệ thống tạo ra những thread khác cho tất cả các task. Ứng dụng của bạn có thể sử dụng những thread của hệ thống hoặc tự tạo thread mới. Bạn có thể tạo và quản lý thread một cách trực tiếp. Tuy nhiên nếu không có sự hiểu biết về hệ thống ở cấp độ thấp và phần cứng, bạn sẽ ko quản lý được thread và làm crash app. Do đó hãy sử dụng GCD và Operation để set up task và để cho hệ thống quản lý thread.

Những gì mình sẽ nói tiếp?

Thông qua bài giới thiệu nho nhỏ này, các bạn chắc hẳn đã nắm tổng quan về concurrency. Ở bài tiếp theo mình sẽ giới thiệu một số thuật ngữ (Terminology) và vấn đề hay gặp trong thế giới concurrency. Hẹn gặp các bạn ở những bài viết kế tiếp trong chuỗi series về iOS concurrency.