Utilidad simple para ejecutar solo código de vez en cuando.
Esto solo ejecutará el bloque pasado para un name de pila si la última vez que se llamó es mayor que limit o nunca se ha llamado.
Esto es realmente útil para cosas refrescantes en viewDidAppear: pero evitar que suceda una tonelada si se actualizó.
El límite de velocidad es completamente seguro de hilo. Liberado bajo la licencia MIT.
Comenzaremos con un 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.
}Los limitadores no se persisten en los lanzamientos de aplicaciones.
TimedLimiter se ajusta al protocolo SyncLimiter . Esto significa que el bloque que pasa para ejecutar se llamará sincrónicamente en la cola desde la que lo llamó si debía disparar. TimedLimiter usa tiempo para limitar.
CountedLimiter también está incluido. Esto funciona tomando un límite como UInt durante el número máximo de veces para ejecutar el bloque.
El protocolo SyncLimiter tiene una extensión realmente ordenada que te permite hacer cosas como esta:
let funFactLimiter = CountedLimiter ( limit : 2 )
let funFact = funFactLimiter . execute { ( ) -> String in
// Do real things to get a fun fact from a list
return " Hi "
} ¿Ahora funFact es una String? . Es solo una opcional de lo que sea que regreses del bloque. El valor devuelto será nil si el bloque no se ejecuta.
¡Por supuesto que también puedes hacer tu propio SyncLimiter !
Se incluye un AsyncLimiter . También puedes hacer el tuyo. El limitador de asíncrono incluido es DebouncedLimiter . Esto es perfecto para hacer solicitudes de red como tipos de usuarios u otras tareas que respondan a eventos muy frecuentes.
La interfaz es ligeramente diferente:
let searchLimiter = DebouncedLimiter ( limit : 1 , block : performSearch )
func textDidChange ( ) {
searchLimiter . execute ( )
}Tendría que configurar el limitador en un inicializador ya que hace referencia a un método de instancia, pero obtiene la idea. El bloque se llamará como máximo una vez por segundo en esta configuración.
¡Bastante fácil!
Abra el proyecto Xcode incluido para una aplicación de ejemplo y pruebas.
Cartago es la forma recomendada de instalar el límite de tasa. Agregue lo siguiente a su Cartfile:
github "soffes/RateLimit" Agregue lo siguiente a su Podfile :
pod "RateLimit" Luego ejecute pod install .