Um loop de execução é uma abstração que (entre outras coisas) fornece um mecanismo para lidar com as fontes de entrada do sistema (soquetes, portas, arquivos, teclado, mouse, temporizadores, etc).
Cada NSThread tem seu próprio loop de execução, que pode ser acessado por meio do método currentRunLoop.
Em geral, você não precisa acessar o loop de execução diretamente, embora haja alguns componentes (de rede) que podem permitir que você especifique qual loop de execução eles usarão para processamento de E / S.
Um loop de execução para um determinado encadeamento esperará até que uma ou mais de suas fontes de entrada tenham alguns dados ou eventos e, em seguida, disparará o (s) manipulador (es) de entrada apropriado (s) para processar cada fonte de entrada que está "pronta".
Depois de fazer isso, ele retornará ao seu loop, processando a entrada de várias fontes e "dormindo" se não houver trabalho a fazer.
Essa é uma descrição de nível bastante elevado (tentando evitar muitos detalhes).
EDITAR
Uma tentativa de abordar o comentário. Eu o quebrei em pedaços.
- isso significa que eu só posso acessar / executar o loop dentro do thread, certo?
De fato. NSRunLoop não é seguro para thread e só deve ser acessado a partir do contexto do thread que está executando o loop.
- existe algum exemplo simples de como adicionar evento para executar o loop?
Se você quiser monitorar uma porta, basta adicionar essa porta ao loop de execução e, em seguida, o loop de execução observará a atividade dessa porta.
- (void)addPort:(NSPort *)aPort forMode:(NSString *)mode
Você também pode adicionar um cronômetro explicitamente com
- (void)addTimer:(NSTimer *)aTimer forMode:(NSString *)mode
- o que significa que ele retornará ao seu loop?
O loop de execução processará todos os eventos prontos a cada iteração (de acordo com seu modo). Você precisará consultar a documentação para descobrir sobre os modos de execução, pois isso está um pouco além do escopo de uma resposta geral.
- O loop de execução está inativo quando eu inicio o thread?
Na maioria dos aplicativos, o loop de execução principal será executado automaticamente. No entanto, você é responsável por iniciar o loop de execução e responder aos eventos de entrada dos threads que rodar.
- é possível adicionar alguns eventos ao loop de execução de Thread fora do thread?
Não tenho certeza do que você quer dizer aqui. Você não adiciona eventos ao loop de execução. Você adiciona fontes de entrada e fontes de cronômetro (do thread que possui o loop de execução). O loop de corrida então observa a atividade deles. Você pode, é claro, fornecer entrada de dados de outros encadeamentos e processos, mas a entrada será processada pelo loop de execução que está monitorando essas fontes no encadeamento que está executando o loop de execução.
- Isso significa que às vezes posso usar o loop de execução para bloquear o thread por um tempo
De fato. Na verdade, um loop de execução "permanecerá" em um manipulador de eventos até que ele retorne. Você pode ver isso em qualquer aplicativo de forma simples. Instale um manipulador para qualquer ação IO (por exemplo, pressionar o botão) que entra em suspensão. Você bloqueará o loop de execução principal (e toda a IU) até que o método seja concluído.
O mesmo se aplica a qualquer loop de execução.
Eu sugiro que você leia a seguinte documentação sobre loops de execução:
https://developer.apple.com/documentation/foundation/nsrunloop
e como eles são usados nos threads:
https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html#//apple_ref/doc/uid/10000057i-CH16-SW1