Trong phát triển ứng dụng iOS, thread là một khái niệm quan trọng. Thread đóng vai trò quản lý và thực thi công việc trên một phần của ứng dụng. Trong Swift iOS, ta có thể tạo và quản lý các thread với các công cụ như Grand Central Dispatch (GCD) và Operation Queue. Multiple thread đề cập đến việc sử dụng nhiều thread để xử lý các tác vụ đồng thời trong ứng dụng của bạn.
Multiple Thread là gì?
Multiple Thread, hay còn gọi là đa luồng, là một tiến trình thực hiện nhiều luồng đồng thời. Trong một ứng dụng, bên cạnh luồng chính có thể có các luồng khác thực thi đồng thời, giúp ứng dụng chạy nhanh và hiệu quả hơn. Multiple thread đơn giản là việc sử dụng nhiều thread trong ứng dụng để xử lý các tác vụ đồng thời. Khi một ứng dụng chạy trên nhiều thread, các tác vụ có thể được thực hiện song song, giúp cải thiện hiệu suất và trải nghiệm người dùng.
Ví dụ khi chúng ta sử dụng một ứng dụng có tác vụ upload video. Khi thực hiện upload một video có dung lượng hàng trăm mb thì thời gian upload khá lâu. Nếu vẫn để người dùng chờ tại màn hình đấy thì thật tệ đúng không nào? Vì lẽ đó chúng ta có thể cho tiến trình upload video chạy background thread và cho người dùng sử dụng ứng dụng như bình thường.
Ưu điểm của Multiple Thread:
- Không chặn người sử dụng vì các luồng là độc lập và bạn có thể thực hiện nhiều công việc cùng một lúc.
- Mỗi luồng có thể dùng chung và chia sẻ nguồn tài nguyên trong quá trình chạy, nhưng có thể thực hiện một cách độc lập.
- Luồng là độc lập vì vậy nó không ảnh hưởng đến luồng khác nếu ngoại lệ xảy ra trong một luồng duy nhất.
- Có thể thực hiện nhiều hoạt động với nhau để tiết kiệm thời gian.
Nhược điểm của Multiple Thread:
- Càng nhiều luồng thì xử lý càng phức tạp
- Xử lý vấn đề về tranh chấp bộ nhớ, đồng bộ dữ liệu khá phức tạp.
- Cần phát hiện tránh các luồng chết (dead lock), luồng chạy mà không làm gì trong ứng dụng cả.
Các loại thread trong Swift iOS
Main Thread (MainThread)
MainThread là thread chính trong ứng dụng Swift iOS. Nó thực hiện toàn bộ tương tác giao diện người dùng và các tác vụ quan trọng khác, chẳng hạn như cập nhật giao diện hoặc xử lý sự kiện từ người dùng. Việc thực hiện các tác vụ chính trên Main Thread đảm bảo tính nhất quán trong giao diện người dùng.
DispatchQueue.main.async {
// Your code here
}
Background Thread (Global Queue)
Background Thread là một loại thread được sử dụng để thực hiện các tác vụ nền không liên quan đến giao diện người dùng. Swift iOS cung cấp các Global Queue cho việc tạo background thread, giúp xử lý các tác vụ phức tạp mà không ảnh hưởng đến giao diện người dùng.
DispatchQueue.global(qos: .background).async {
// Your code here
}
Custom Thread (DispatchQueue)
Ngoài Main Thread và Background Thread, ta có thể tạo ra các thread tùy chỉnh trong Swift iOS sử dụng DispatchQueue. Công cụ này cho phép ta tạo ra các DispatchQueue có thể chạy đồng thời hoặc tuần tự. Các DispatchQueue có thể được sử dụng để thực thi các tác vụ tương đối nhẹ nhàng, không ảnh hưởng đến hiệu suất chung của ứng dụng.
let customQueue = DispatchQueue(label: "com.example.myqueue")
customQueue.async {
// Your code here
}
Concurrent Queue và Serial Queue
Trong Swift iOS, có hai loại DispatchQueue: Concurrent Queue và Serial Queue. Concurrent Queue cho phép chạy nhiều tác vụ đồng thời, trong khi Serial Queue thực thi tuần tự các tác vụ. Lựa chọn giữa Concurrent Queue và Serial Queue phụ thuộc vào yêu cầu cụ thể của ứng dụng.
Serial Queue:
let serialQueue = DispatchQueue(label: "com.example.serialqueue")
serialQueue.async {
// Your code here
}
Concurrent Queue:
let concurrentQueue = DispatchQueue(label: "com.example.concurrentqueue", attributes: .concurrent)
concurrentQueue.async {
// Your code here
}
DispatchQueue và DispatchGroup
DispatchQueue có thể được sử dụng cùng với DispatchGroup để quản lý các tác vụ đồng thời trong Swift iOS. DispatchGroup cho phép theo dõi hoàn thành của một nhóm các tác vụ, và chờ đợi cho đến khi tất cả các tác vụ trong nhóm được hoàn thành trước khi tiếp tục thực thi các tác vụ khác.
let group = DispatchGroup()
let queue = DispatchQueue(label: "com.example.myqueue", attributes: .concurrent)
group.enter()
queue.async(group: group) {
// Your code here
group.leave()
}
group.notify(queue: .main) {
// This block will be executed once all tasks in the group are finished
}
Dispatch Barrier
DispatchBarrier là một công cụ hữu ích khi ta muốn đảm bảo tính nhất quán trong việc đọc và ghi dữ liệu từ một Dispatch Queue. Khi ta sử dụng DispatchBarrier, tất cả các tác vụ trước DispatchBarrier phải hoàn thành trước khi tác vụ sau DispatchBarrier được thực hiện.
let concurrentQueue = DispatchQueue(label: "com.example.concurrentqueue", attributes: .concurrent)
concurrentQueue.async(flags: .barrier) {
// Your code here
}
Kết luận
Trong bài viết này, Chúng ta đã tìm hiểu về multiple thread trong Swift iOS. Đã biết các loại thread như Main Thread, Background Thread và Custom Thread. Đã tìm hiểu về cách quản lý multiple thread. Với kiến thức này, ta có thể sử dụng multiple thread một cách hiệu quả để cải thiện hiệu suất và trải nghiệm người dùng trong ứng dụng Swift iOS.
Trong bài viết sau chúng ta sẽ tìm hiểu chi tiết từng loại thread và tác dụng của chúng trong dự án nhé.
Tìm hiểu thêm về các framework phát triển ứng dụng nhé: PHÁT TRIỂN ỨNG DỤNG DI ĐỘNG ĐA NỀN TẢNG (CROSS-PLATFORM MOBILE DEVELOPMENT)