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