Простая утилита только для выполнения кода время от времени.
Это выполнит блок, пройденное для данного name только если в последний раз, когда оно называлось, больше, чем limit , или его никогда не вызвали.
Это действительно удобно для освежающих вещей в viewDidAppear: но не допустит, чтобы это не произошло, если это было просто освежено.
Предел скорости полностью защищен. Выпущено по лицензии MIT.
Мы начнем с 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.
}Ограничители не сохраняются в течение запуска приложений.
TimedLimiter соответствует протоколу SyncLimiter . Это означает, что блок, который вы проходите для выполнения, будет называться синхронно в очереди, из которой вы его назвали, если он должен стрелять. TimedLimiter использует время для ограничения.
CountedLimiter также включен. Это работает, принимая ограничение в качестве UInt в течение максимального количества раз для запуска блока.
Протокол SyncLimiter имеет действительно аккуратное расширение, которое позволяет вам делать то, что так:
let funFactLimiter = CountedLimiter ( limit : 2 )
let funFact = funFactLimiter . execute { ( ) -> String in
// Do real things to get a fun fact from a list
return " Hi "
} Теперь funFact - это String? Полем Это просто необязательно то, что вы возвращаете из блока. Возвращенное значение будет nil , если блок не запустится.
Вы, конечно, тоже можете сделать свой собственный SyncLimiter !
Один AsyncLimiter включен. Вы тоже можете сделать свой собственный. Включенный асинхронный ограничитель DebouncedLimiter . Это идеально подходит для выполнения сетевых запросов в качестве типов пользователей или других задач, которые отвечают на очень частые события.
Интерфейс немного отличается:
let searchLimiter = DebouncedLimiter ( limit : 1 , block : performSearch )
func textDidChange ( ) {
searchLimiter . execute ( )
}Вам придется настроить ограничитель в инициализатора, так как он ссылается на метод экземпляра, но вы поняли идею. Блок будет вызоваться не более одного раза в секунду в этой конфигурации.
Довольно легко!
Откройте включенный проект XCode для примера приложения и тестов.
Карфаген - это рекомендуемый способ установить предел ставки. Добавьте следующее в свой Cartfile:
github "soffes/RateLimit" Добавьте следующее в свой Podfile :
pod "RateLimit" Затем запустите pod install .