Pętla uruchamiania to abstrakcja, która (między innymi) zapewnia mechanizm do obsługi systemowych źródeł wejściowych (gniazd, portów, plików, klawiatury, myszy, zegarów itp.).
Każdy NSThread ma własną pętlę uruchamiania, do której można uzyskać dostęp za pomocą metody currentRunLoop.
Generalnie nie ma potrzeby bezpośredniego dostępu do pętli uruchamiania, chociaż istnieją pewne komponenty (sieciowe), które mogą pozwolić na określenie, której pętli będą używać do przetwarzania we / wy.
Pętla uruchamiania dla danego wątku będzie czekać, aż jedno lub więcej jego źródeł wejściowych będzie miało jakieś dane lub zdarzenia, a następnie uruchomi odpowiednią procedurę obsługi wejścia w celu przetworzenia każdego źródła wejściowego, które jest „gotowe”.
Po wykonaniu tej czynności powróci do swojej pętli, przetwarzając dane wejściowe z różnych źródeł i „śpiąc”, jeśli nie ma pracy.
To opis na dość wysokim poziomie (próba uniknięcia zbyt wielu szczegółów).
EDYTOWAĆ
Próba odniesienia się do komentarza. Rozbiłam to na kawałki.
- oznacza to, że mogę uzyskać dostęp / uruchomić tylko pętlę wewnątrz wątku, prawda?
W rzeczy samej. NSRunLoop nie jest bezpieczny dla wątków i powinien być dostępny tylko z kontekstu wątku, który uruchamia pętlę.
- czy jest jakiś prosty przykład, jak dodać zdarzenie do uruchomienia pętli?
Jeśli chcesz monitorować port, po prostu dodaj ten port do pętli uruchamiania, a następnie pętla uruchamiania będzie obserwować ten port pod kątem aktywności.
- (void)addPort:(NSPort *)aPort forMode:(NSString *)mode
Możesz również jawnie dodać licznik czasu za pomocą
- (void)addTimer:(NSTimer *)aTimer forMode:(NSString *)mode
- co oznacza, że wróci do swojej pętli?
Pętla uruchamiania będzie przetwarzać wszystkie gotowe zdarzenia w każdej iteracji (zgodnie ze swoim trybem). Będziesz musiał przejrzeć dokumentację, aby dowiedzieć się o trybach uruchamiania, ponieważ jest to nieco poza zakresem ogólnej odpowiedzi.
- czy pętla uruchamiania jest nieaktywna, kiedy uruchamiam wątek?
W większości aplikacji główna pętla uruchamiania będzie działać automatycznie. Jednak jesteś odpowiedzialny za uruchomienie pętli uruchamiania i reagowanie na zdarzenia przychodzące dla wątków, które obracasz.
- czy możliwe jest dodanie niektórych zdarzeń do pętli uruchamiania wątku poza wątkiem?
Nie jestem pewien, co masz na myśli. Nie dodajesz zdarzeń do pętli uruchamiania. Dodajesz źródła wejściowe i źródła licznika czasu (z wątku, który jest właścicielem pętli uruchamiania). Następnie pętla biegania obserwuje je pod kątem aktywności. Możesz oczywiście podać dane wejściowe z innych wątków i procesów, ale dane wejściowe będą przetwarzane przez pętlę uruchamiania, która monitoruje te źródła w wątku, który uruchamia pętlę uruchamiania.
- Czy to oznacza, że czasami mogę użyć pętli uruchamiania do blokowania wątku na jakiś czas
W rzeczy samej. W rzeczywistości pętla uruchamiania „pozostanie” w procedurze obsługi zdarzeń, dopóki ta procedura obsługi zdarzenia nie zwróci. Możesz to zobaczyć w dowolnej aplikacji po prostu. Zainstaluj program obsługi dla każdej akcji we / wy (np. Naciśnięcie przycisku), która jest w stanie uśpienia. Będziesz blokować główną pętlę uruchamiania (i cały interfejs użytkownika) do czasu zakończenia tej metody.
To samo dotyczy każdej pętli uruchamiania.
Proponuję przeczytać następującą dokumentację dotyczącą pętli uruchamiania:
https://developer.apple.com/documentation/foundation/nsrunloop
i jak są używane w wątkach:
https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html#//apple_ref/doc/uid/10000057i-CH16-SW1