فائدة بسيطة لتنفيذ الكود فقط كل مرة.
سيؤدي ذلك إلى تنفيذ الكتلة التي تم تمريرها فقط name معين إذا كانت آخر مرة تم استدعاؤها أكبر من limit أو لم يتم استدعاؤها أبدًا.
هذا أمر مفيد حقًا للمنعش في viewDidAppear: ولكن منعه من حدوث طن إذا تم تحديثه للتو.
حد السعر آمن بشكل كامل. صدر تحت رخصة معهد ماساتشوستس للتكنولوجيا.
سنبدأ مع 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 s أيضا!
يتم تضمين واحد AsyncLimiter . يمكنك أن تصنع بنفسك أيضًا. DebouncedLimiter تحديد محدد Async المشمل. هذا مثالي لطلب طلبات الشبكة كنوع مستخدمين أو مهام أخرى تستجيب للأحداث المتكررة للغاية.
الواجهة مختلفة قليلاً:
let searchLimiter = DebouncedLimiter ( limit : 1 , block : performSearch )
func textDidChange ( ) {
searchLimiter . execute ( )
}سيتعين عليك إعداد المحدد في مُهيئ لأنه يشير إلى طريقة مثيل ، لكنك تحصل على الفكرة. سيتم استدعاء الكتلة على الأكثر مرة واحدة في الثانية في هذا التكوين.
سهل جدا!
افتح مشروع Xcode المضمون للحصول على تطبيق مثال واختبارات.
قرطاج هو الطريقة الموصى بها لتثبيت حد معدل. أضف ما يلي إلى Cartfile الخاص بك:
github "soffes/RateLimit" أضف ما يلي إلى Podfile الخاص بك:
pod "RateLimit" ثم قم بتشغيل pod install .