頻繁にコードのみを実行するためのシンプルなユーティリティ。
これは、前回の呼び出された時間が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も作成できます!
1つのAsyncLimiterが含まれています。あなたも自分で作ることができます。含まれているAsyncリミッターはDebouncedLimiterです。これは、非常に頻繁なイベントに応答するユーザータイプまたはその他のタスクとしてネットワークリクエストを作成するのに最適です。
インターフェイスはわずかに異なります:
let searchLimiter = DebouncedLimiter ( limit : 1 , block : performSearch )
func textDidChange ( ) {
searchLimiter . execute ( )
}Intializerはインスタンスメソッドを参照するため、Initializerでリミッターをセットアップする必要がありますが、アイデアが得られます。この構成では、ブロックは1秒あたり1回1回呼び出されます。
かなり簡単です!
サンプルアプリとテストのために、付属のXcodeプロジェクトを開きます。
Carthageは、レート制限をインストールする推奨方法です。 Cartfileに次のことを追加します。
github "soffes/RateLimit" Podfileに以下を追加します。
pod "RateLimit"次に、 pod installを実行します。