ยูทิลิตี้ง่าย ๆ สำหรับการเรียกใช้รหัสทุกครั้งเท่านั้น
สิ่งนี้จะดำเนินการเฉพาะบล็อกที่ส่งผ่านสำหรับ 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 รวมอยู่ด้วย คุณสามารถทำเองได้เช่นกัน ตัว จำกัด async ที่รวมอยู่คือ DebouncedLimiter นี่เป็นสิ่งที่สมบูรณ์แบบสำหรับการร้องขอเครือข่ายเป็นประเภทผู้ใช้หรืองานอื่น ๆ ที่ตอบสนองต่อเหตุการณ์ที่พบบ่อยมาก
อินเทอร์เฟซแตกต่างกันเล็กน้อย:
let searchLimiter = DebouncedLimiter ( limit : 1 , block : performSearch )
func textDidChange ( ) {
searchLimiter . execute ( )
}คุณจะต้องตั้งค่าตัว จำกัด ในตัวเริ่มต้นเนื่องจากมันอ้างอิงถึงวิธีการอินสแตนซ์ แต่คุณได้รับแนวคิด บล็อกจะถูกเรียกอย่างมากที่สุดหนึ่งครั้งต่อวินาทีในการกำหนดค่านี้
ค่อนข้างง่าย!
เปิดโครงการ Xcode ที่รวมไว้สำหรับแอพและการทดสอบตัวอย่าง
คาร์เธจเป็นวิธีที่แนะนำในการติดตั้งขีด จำกัด อัตรา เพิ่มสิ่งต่อไปนี้ใน CartFile ของคุณ:
github "soffes/RateLimit" เพิ่มสิ่งต่อไปนี้ใน Podfile ของคุณ:
pod "RateLimit" จากนั้นเรียกใช้ pod install