Tại sao cần chạy vòng lặp khi sử dụng DispatchQueue.main.async trong công cụ dòng lệnh mac nhanh chóng?

Aug 15 2020

Tôi đã tìm thấy tài liệu của Apple để hiểu tại sao tôi nên sử dụng vòng lặp chạy để triển khai tác vụ trong hàng đợi gửi chính.

Theo tài liệu của Apple ,

Hàng đợi điều phối chính là một hàng đợi nối tiếp có sẵn trên toàn cầu thực thi các tác vụ trên luồng chính của ứng dụng. Hàng đợi này hoạt động với vòng lặp chạy của ứng dụng (nếu có) để xen kẽ việc thực thi các tác vụ được xếp hàng đợi với việc thực thi các nguồn sự kiện khác được gắn vào vòng lặp chạy. Bởi vì nó chạy trên luồng chính của ứng dụng của bạn, hàng đợi chính thường được sử dụng làm điểm đồng bộ hóa chính cho một ứng dụng.

nhưng tôi vẫn không thể hiểu vòng lặp chạy 'tại sao' là cần thiết. nó nghe giống như 'nó cần vòng lặp chạy vì nó cần vòng lặp chạy'. Tôi sẽ rất cảm kích nếu ai đó giải thích cho tôi về điều này. Cảm ơn bạn.

Trả lời

1 matt Aug 15 2020 at 19:37

tại sao tôi nên sử dụng vòng lặp chạy để triển khai tác vụ trong hàng đợi điều phối chính

Thông thường thì không, vì bạn đã sử dụng một cái rồi!

Trong một dự án ứng dụng, có một chính hàng đợi chạy vòng lặp đã . Ví dụ: một dự án ứng dụng iOS thực ra không có gì khác ngoài một lệnh gọi khổng lồ đến UIApplicationMain, cung cấp một vòng lặp chạy.

Đó là cách nó có thể ngồi đó chờ người dùng làm điều gì đó. Vòng lặp chạy là, uh, đang chạy. Và lặp lại.

Nhưng trong một công cụ dòng lệnh Mac, không có vòng lặp chạy tự động. Nó chạy chức năng chính của nó và thoát ngay lập tức. Nếu bạn không cần nó để làm điều đó, bạn sẽ cung cấp một vòng lặp chạy.

1 KavinduChathuranga Aug 15 2020 at 18:52

DispatchQueue.main.async là khi bạn có mã chạy trên hàng đợi nền và bạn cần một khối mã cụ thể để được thực thi trên hàng đợi chính.

Trong mã của bạn, viewDidLoadđã chạy trên hàng đợi chính vì vậy, có rất ít lý do để sử dụng DispatchQueue.main.async.

Nhưng không hẳn là sai khi sử dụng nó. Nhưng nó thay đổi thứ tự thực hiện.

quá trình đóng async được xếp hàng đợi để chạy sau khi vòng chạy hiện tại hoàn tất.

Rob Aug 15 2020 at 23:56

tôi không thể hiểu vòng lặp chạy 'tại sao' là cần thiết

Nói chung, vòng lặp chạy không cần thiết cho các ứng dụng dòng lệnh. Bạn có thể sử dụng vòng lặp chạy nếu bạn có nhu cầu đặc biệt (ví dụ: bạn có một số giao diện người dùng động đang thực hiện một số tác vụ trong khi bạn chờ người dùng nhập), nhưng phần lớn các ứng dụng dòng lệnh không yêu cầu vòng lặp chạy.

Như các tài liệu nói:

Vòng lặp chạy là một vòng lặp xử lý sự kiện mà bạn sử dụng để lập lịch làm việc và điều phối việc nhận các sự kiện đến. Mục đích của vòng lặp là giữ cho chuỗi của bạn bận khi có việc phải làm và đặt chuỗi của bạn ở chế độ ngủ khi không có việc nào.

Vì vậy, nếu bạn cần để ứng dụng của mình đợi một số sự kiện đến hoặc bạn đang điều phối các tác vụ không đồng bộ giữa các hàng đợi, thì tốt thôi, hãy sử dụng các vòng lặp chạy, nhưng nếu không, đừng bận tâm. Hầu hết các ứng dụng dòng lệnh hoàn toàn không cần sử dụng các vòng lặp.