Utilitário simples para executar apenas o código de vez em quando.
Isso executará apenas o bloco passado para um determinado name se a última vez que foi chamada for maior que limit ou nunca foi chamado.
Isso é realmente útil para coisas refrescantes no viewDidAppear: mas impedir que isso aconteça uma tonelada se fosse apenas atualizado.
O limite de taxa é totalmente seguro. Liberado sob a licença do MIT.
Começaremos com um TimedLimiter :
// Initialize with a limit of 5, so you can only use this once every 5 seconds.
let refreshTimeline = TimedLimiter ( limit : 5 )
// Call the work you want to limit by passing a block to the execute method.
refreshTimeline . execute {
// Do some work that runs a maximum of once per 5 seconds.
}Os limitadores não são persistidos nos lançamentos de aplicativos.
TimedLimiter está em conformidade com o protocolo SyncLimiter . Isso significa que o bloco que você passa para executar será chamado de forma síncrona na fila de onde você chamou se ela deve disparar. TimedLimiter usa tempo para limitar.
CountedLimiter também está incluído. Isso funciona tendo um limite como um UInt para o número máximo de vezes para executar o bloco.
O protocolo SyncLimiter tem uma extensão realmente interessante que permite fazer coisas assim:
let funFactLimiter = CountedLimiter ( limit : 2 )
let funFact = funFactLimiter . execute { ( ) -> String in
// Do real things to get a fun fact from a list
return " Hi "
} Agora funFact é uma String? . É apenas uma opção do que você retornar do bloco. O valor retornado será nil se o bloco não funcionar.
É claro que você também pode fazer com que seu próprio SyncLimiter seja!
Um AsyncLimiter está incluído. Você pode fazer o seu próprio também. O limitador assíncrono incluído é DebouncedLimiter . Isso é perfeito para fazer solicitações de rede como tipos de usuário ou outras tarefas que respondem a eventos muito frequentes.
A interface é um pouco diferente:
let searchLimiter = DebouncedLimiter ( limit : 1 , block : performSearch )
func textDidChange ( ) {
searchLimiter . execute ( )
}Você precisaria configurar o limitador em um inicializador, pois ele faz referência a um método de instância, mas você obtém a ideia. O bloco será chamado no máximo uma vez por segundo nesta configuração.
Muito fácil!
Abra o projeto Xcode incluído para um exemplo de aplicativo e testes.
Cartago é a maneira recomendada de instalar o limite de taxa. Adicione o seguinte ao seu arquivo Cart:
github "soffes/RateLimit" Adicione o seguinte ao seu Podfile :
pod "RateLimit" Em seguida, execute pod install .