Vòng lặp chạy là một phần trừu tượng (trong số những thứ khác) cung cấp một cơ chế để xử lý các nguồn đầu vào của hệ thống (ổ cắm, cổng, tệp, bàn phím, chuột, bộ định thời, v.v.).
Mỗi NSThread có vòng lặp chạy riêng, có thể được truy cập thông qua phương thức currentRunLoop.
Nói chung, bạn không cần phải truy cập trực tiếp vào vòng lặp chạy, mặc dù có một số thành phần (mạng) có thể cho phép bạn chỉ định vòng lặp chạy mà chúng sẽ sử dụng để xử lý I / O.
Vòng lặp chạy cho một luồng nhất định sẽ đợi cho đến khi một hoặc nhiều nguồn đầu vào của nó có một số dữ liệu hoặc sự kiện, sau đó kích hoạt (các) trình xử lý đầu vào thích hợp để xử lý từng nguồn đầu vào đã "sẵn sàng".
Sau khi làm như vậy, nó sẽ quay trở lại vòng lặp của nó, xử lý đầu vào từ nhiều nguồn khác nhau và "ngủ" nếu không có việc gì phải làm.
Đó là một mô tả cấp độ khá cao (cố gắng tránh quá nhiều chi tiết).
BIÊN TẬP
Một nỗ lực để giải quyết bình luận. Tôi đã bẻ nó thành nhiều mảnh.
- nó có nghĩa là tôi chỉ có thể truy cập / chạy để chạy vòng lặp bên trong luồng phải không?
Thật. NSRunLoop không an toàn cho luồng và chỉ nên được truy cập từ ngữ cảnh của luồng đang chạy vòng lặp.
- có bất kỳ ví dụ đơn giản nào về cách thêm sự kiện để chạy vòng lặp không?
Nếu bạn muốn giám sát một cổng, bạn chỉ cần thêm cổng đó vào vòng lặp chạy, và sau đó vòng chạy sẽ theo dõi cổng đó hoạt động.
- (void)addPort:(NSPort *)aPort forMode:(NSString *)mode
Bạn cũng có thể thêm bộ hẹn giờ một cách rõ ràng với
- (void)addTimer:(NSTimer *)aTimer forMode:(NSString *)mode
- nghĩa là nó sẽ quay trở lại vòng lặp của nó là gì?
Vòng lặp chạy sẽ xử lý tất cả các sự kiện sẵn sàng mỗi lần lặp lại (theo chế độ của nó). Bạn sẽ cần xem tài liệu để khám phá về các chế độ chạy, vì điều đó hơi vượt quá phạm vi của một câu trả lời chung.
- vòng lặp chạy không hoạt động khi tôi bắt đầu chuỗi?
Trong hầu hết các ứng dụng, vòng chạy chính sẽ tự động chạy. Tuy nhiên, bạn chịu trách nhiệm bắt đầu vòng lặp chạy và phản hồi các sự kiện đến cho các luồng bạn quay.
- có thể thêm một số sự kiện vào chuỗi chạy vòng lặp bên ngoài chuỗi không?
Tôi không chắc bạn muốn nói gì ở đây. Bạn không thêm sự kiện vào vòng lặp chạy. Bạn thêm nguồn đầu vào và nguồn hẹn giờ (từ luồng sở hữu vòng lặp chạy). Vòng chạy sau đó xem chúng để biết hoạt động. Tất nhiên, bạn có thể cung cấp đầu vào dữ liệu từ các luồng và quy trình khác, nhưng đầu vào sẽ được xử lý bởi vòng lặp đang theo dõi các nguồn đó trên luồng đang chạy vòng lặp.
- nó có nghĩa là đôi khi tôi có thể sử dụng vòng lặp chạy để chặn luồng trong một thời gian
Thật. Trên thực tế, một vòng lặp chạy sẽ "ở lại" trong một trình xử lý sự kiện cho đến khi trình xử lý sự kiện đó quay trở lại. Bạn có thể thấy điều này trong bất kỳ ứng dụng nào đơn giản là đủ. Cài đặt trình xử lý cho bất kỳ hành động IO nào (ví dụ: nhấn nút) ở chế độ ngủ. Bạn sẽ chặn vòng lặp chạy chính (và toàn bộ giao diện người dùng) cho đến khi phương thức đó hoàn tất.
Điều tương tự cũng áp dụng cho bất kỳ vòng lặp chạy nào.
Tôi khuyên bạn nên đọc tài liệu sau về vòng lặp chạy:
https://developer.apple.com/documentation/foundation/nsrunloop
và cách chúng được sử dụng trong chuỗi:
https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html#//apple_ref/doc/uid/10000057i-CH16-SW1