Utilitaire simple pour exécuter uniquement le code de temps en temps.
Cela ne fera que l'exécution du bloc passé pour un name que si la dernière fois qu'il a été appelé est supérieur à limit ou s'il n'a jamais été appelé.
C'est vraiment pratique pour des trucs rafraîchissants dans viewDidAppear: mais l'empêcher de se produire une tonne si c'était simplement rafraîchi.
La limite de taux est entièrement en file d'attente. Libéré sous la licence du MIT.
Nous allons commencer par 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.
}Les limiteurs ne sont pas persistés dans les lancements d'applications.
TimedLimiter se conforme au protocole SyncLimiter . Cela signifie que le bloc que vous passez pour exécuter sera appelé de manière synchrone sur la file d'attente que vous l'avez appelée s'il devait tirer. TimedLimiter utilise le temps pour limiter.
CountedLimiter est également inclus. Cela fonctionne en prenant une limite en tant UInt pour le nombre maximum de fois pour exécuter le bloc.
Le protocole SyncLimiter a une extension vraiment soignée qui vous permet de faire des choses comme ceci:
let funFactLimiter = CountedLimiter ( limit : 2 )
let funFact = funFactLimiter . execute { ( ) -> String in
// Do real things to get a fun fact from a list
return " Hi "
} Maintenant, funFact est une String? . C'est juste une option de tout ce que vous retournez du bloc. La valeur renvoyée sera nil si le bloc n'a pas fonctionné.
Vous pouvez bien sûr faire votre propre SyncLimiter aussi!
Un AsyncLimiter est inclus. Vous pouvez aussi faire le vôtre. Le limiteur asynchrone inclus est DebouncedLimiter . Ceci est parfait pour faire des demandes de réseau en tant que types d'utilisateurs ou autres tâches qui répondent à des événements très fréquents.
L'interface est légèrement différente:
let searchLimiter = DebouncedLimiter ( limit : 1 , block : performSearch )
func textDidChange ( ) {
searchLimiter . execute ( )
}Vous devrez configurer le limiteur dans un initialiseur car il fait référence à une méthode d'instance, mais vous avez l'idée. Le bloc sera appelé au plus une fois par seconde dans cette configuration.
Assez facile!
Ouvrez le projet Xcode inclus pour un exemple d'application et de tests.
Carthage est le moyen recommandé d'installer la limite de taux. Ajoutez ce qui suit à votre carton:
github "soffes/RateLimit" Ajoutez ce qui suit à votre Podfile :
pod "RateLimit" Puis exécutez pod install .