코드를 자주 실행하기위한 간단한 유틸리티.
마지막으로 호출 된 시간이 limit 보다 크거나 호출되지 않은 경우 주어진 name 으로 전달 된 블록 만 실행합니다.
이것은 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 프로젝트를 엽니 다.
Carthage는 속도 제한을 설치하는 권장 방법입니다. 카트 파일에 다음을 추가하십시오.
github "soffes/RateLimit" Podfile 에 다음을 추가하십시오.
pod "RateLimit" 그런 다음 pod install 실행하십시오.