Tại sao lại sử dụng đồng thời?
Ngay sau khi bạn thêm các tác vụ nặng vào ứng dụng của mình như tải dữ liệu, nó sẽ làm chậm giao diện người dùng của bạn hoạt động hoặc thậm chí đóng băng. Đồng thời cho phép bạn thực hiện 2 hoặc nhiều tác vụ “đồng thời”. Nhược điểm của phương pháp này là độ an toàn của luồng không phải lúc nào cũng dễ kiểm soát. Fe khi các tác vụ khác nhau muốn truy cập cùng một tài nguyên như cố gắng thay đổi cùng một biến trên một luồng khác nhau hoặc truy cập tài nguyên đã bị chặn bởi các luồng khác nhau.
Có một vài điểm trừu tượng mà chúng ta cần lưu ý.
- Hàng đợi.
- Hiệu suất tác vụ đồng bộ / không đồng bộ.
- Các ưu tiên.
- Những rắc rối thường gặp.
Hàng đợi
Phải nối tiếp hoặc đồng thời . Cũng như toàn cầu hoặc riêng tư cùng một lúc.
Với hàng đợi nối tiếp, các tác vụ sẽ được hoàn thành từng cái một trong khi với hàng đợi đồng thời, các tác vụ sẽ được thực hiện đồng thời và sẽ hoàn thành theo lịch trình đột xuất. Cùng một nhóm nhiệm vụ sẽ tốn nhiều thời gian hơn trên hàng đợi nối tiếp so với hàng đợi đồng thời.
Bạn có thể tạo hàng đợi riêng của mình (cả nối tiếp hoặc đồng thời ) hoặc sử dụng hàng đợi toàn cầu (hệ thống) đã có sẵn . Các hàng đợi chính là chỉ đợi nối tiếp ra khỏi tất cả các hàng đợi toàn cầu .
Chúng tôi khuyên bạn không nên thực hiện các tác vụ nặng không liên quan đến công việc giao diện người dùng trên hàng đợi chính (tải dữ liệu từ mạng) mà thay vào đó, hãy thực hiện chúng trên các hàng đợi khác để giữ cho giao diện người dùng không bị đóng băng và phản hồi các hành động của người dùng. Nếu chúng tôi để giao diện người dùng được thay đổi trên các hàng đợi khác, các thay đổi có thể được thực hiện theo một lịch trình và tốc độ khác và bất ngờ. Một số phần tử giao diện người dùng có thể được vẽ trước hoặc sau khi chúng cần thiết. Nó có thể làm hỏng giao diện người dùng. Chúng ta cũng cần lưu ý rằng vì hàng đợi chung là hàng đợi hệ thống nên một số tác vụ khác có thể được hệ thống chạy trên chúng.
Chất lượng dịch vụ / Ưu tiên
Hàng đợi cũng có các qos (Chất lượng dịch vụ) khác nhau đặt mức độ ưu tiên thực hiện tác vụ (từ cao nhất đến thấp nhất ở đây):
.userInteractive - hàng đợi chính
.userInitiated - cho các tác vụ do người dùng khởi tạo mà người dùng chờ một số phản hồi
.utility - cho các tác vụ điều này mất một thời gian và không yêu cầu phản hồi ngay lập tức, ví dụ: làm việc với dữ liệu
.background - cho các tác vụ không liên quan đến phần hình ảnh và không nghiêm ngặt về thời gian hoàn thành).
Ngoài ra còn có
.DEFAULT hàng đợi mà does't chuyển nhượng qos thông tin. Nếu không thể phát hiện qos ,qos sẽ được sử dụng giữa .userInitiated và .utility .
Các tác vụ có thể được thực hiện đồng bộ hoặc không đồng bộ .
Hàm đồng bộ chỉ trả lại quyền điều khiển cho hàng đợi hiện tại sau khi tác vụ kết thúc. Nó chặn hàng đợi và đợi cho đến khi tác vụ kết thúc.
Hàm không đồng bộ trả về quyền điều khiển hàng đợi hiện tại ngay sau khi tác vụ được gửi để thực hiện trên hàng đợi khác. Nó không đợi cho đến khi nhiệm vụ kết thúc. Nó không chặn hàng đợi.
Các vấn đề chung.
Những sai lầm phổ biến nhất mà các lập trình viên mắc phải khi chiếu các ứng dụng đồng thời là:
- Tình trạng cuộc đua - gây ra khi ứng dụng hoạt động phụ thuộc vào thứ tự thực thi các phần mã.
- Đảo ngược ưu tiên mức độ ưu tiên - khi các tác vụ có mức độ ưu tiên cao hơn chờ các tác vụ có mức độ ưu tiên nhỏ hơn hoàn thành do một số tài nguyên bị chặn
- Bế tắc - khi một số hàng đợi có thời gian chờ vô hạn cho các nguồn (biến, dữ liệu, v.v.) đã bị chặn bởi một số hàng đợi này.
KHÔNG BAO GIỜ gọi hàm đồng bộ trên hàng đợi chính .
Nếu bạn gọi hàm đồng bộ trên hàng đợi chính, nó sẽ chặn hàng đợi cũng như hàng đợi sẽ chờ tác vụ được hoàn thành nhưng tác vụ sẽ không bao giờ kết thúc vì nó thậm chí sẽ không thể bắt đầu do hàng đợi là đã bị chặn. Nó được gọi là bế tắc .
Khi nào sử dụng đồng bộ hóa?
Khi chúng ta cần đợi cho đến khi nhiệm vụ kết thúc. Fe khi chúng ta đảm bảo rằng một số hàm / phương thức không được gọi kép. Fe chúng tôi đã đồng bộ hóa và cố gắng ngăn nó được gọi gấp đôi cho đến khi hoàn tất. Dưới đây là một số mã cho mối quan tâm này:
Làm thế nào để tìm ra nguyên nhân gây ra lỗi báo cáo sự cố trên thiết bị IOS?
DispatchQueue.main.sync
từ một chuỗi nền có sai không?