การวนรอบการทำงานเป็นนามธรรมที่ (เหนือสิ่งอื่นใด) มีกลไกในการจัดการแหล่งอินพุตของระบบ (ซ็อกเก็ตพอร์ตไฟล์แป้นพิมพ์เมาส์ตัวจับเวลา ฯลฯ )
NSThread แต่ละตัวมี run loop ของตัวเองซึ่งสามารถเข้าถึงได้โดยใช้วิธี currentRunLoop
โดยทั่วไปคุณไม่จำเป็นต้องเข้าถึง run loop โดยตรงแม้ว่าจะมีส่วนประกอบ (ระบบเครือข่าย) บางส่วนที่อาจช่วยให้คุณระบุได้ว่าจะใช้ run loop ใดสำหรับการประมวลผล I / O
การวนรอบการรันสำหรับเธรดที่กำหนดจะรอจนกว่าแหล่งอินพุตอย่างน้อยหนึ่งแหล่งมีข้อมูลหรือเหตุการณ์บางอย่างจากนั้นจึงเริ่มการทำงานของตัวจัดการอินพุตที่เหมาะสมเพื่อประมวลผลแหล่งอินพุตแต่ละรายการที่ "พร้อม"
หลังจากทำเช่นนั้นมันจะกลับไปที่ลูปประมวลผลอินพุตจากแหล่งต่างๆและ "นอน" หากไม่มีงานที่ต้องทำ
นั่นเป็นคำอธิบายระดับสูงทีเดียว (พยายามหลีกเลี่ยงรายละเอียดมากเกินไป)
แก้ไข
ความพยายามที่จะกล่าวถึงความคิดเห็น ฉันหักมันออกเป็นชิ้น ๆ
- หมายความว่าฉันสามารถเข้าถึง / รันเพื่อรันลูปภายในเธรดได้เท่านั้นใช่ไหม
แน่นอน. NSRunLoop ไม่ใช่เธรดที่ปลอดภัยและควรเข้าถึงได้จากบริบทของเธรดที่กำลังรันลูปเท่านั้น
- มีตัวอย่างง่ายๆในการเพิ่มเหตุการณ์เพื่อรันลูปหรือไม่?
หากคุณต้องการมอนิเตอร์พอร์ตคุณก็แค่เพิ่มพอร์ตนั้นในรันลูปจากนั้นรันลูปจะเฝ้าดูพอร์ตนั้นสำหรับกิจกรรม
- (void)addPort:(NSPort *)aPort forMode:(NSString *)mode
คุณยังสามารถเพิ่มตัวจับเวลาอย่างชัดเจนด้วย
- (void)addTimer:(NSTimer *)aTimer forMode:(NSString *)mode
- มันจะกลับไปวนซ้ำหมายความว่าอะไร?
ลูปรันจะประมวลผลเหตุการณ์ที่พร้อมใช้งานทั้งหมดในแต่ละการวนซ้ำ (ตามโหมด) คุณจะต้องดูเอกสารประกอบเพื่อค้นหาเกี่ยวกับโหมดการทำงานเนื่องจากมันเกินขอบเขตของคำตอบทั่วไปไปเล็กน้อย
- run loop ไม่ทำงานเมื่อฉันเริ่มเธรดหรือไม่
ในแอปพลิเคชันส่วนใหญ่ลูปรันหลักจะทำงานโดยอัตโนมัติ อย่างไรก็ตามคุณมีหน้าที่รับผิดชอบในการเริ่มรันลูปและตอบสนองต่อเหตุการณ์ที่เข้ามาสำหรับเธรดที่คุณหมุน
- เป็นไปได้ไหมที่จะเพิ่มเหตุการณ์บางอย่างในเธรดรันลูปนอกเธรด
ฉันไม่แน่ใจว่าคุณหมายถึงอะไรที่นี่ คุณไม่ได้เพิ่มเหตุการณ์ในการวนรอบการทำงาน คุณเพิ่มแหล่งอินพุตและแหล่งที่มาของตัวจับเวลา (จากเธรดที่เป็นเจ้าของลูปการรัน) จากนั้นวงวิ่งจะเฝ้าดูพวกเขาสำหรับกิจกรรม แน่นอนคุณสามารถให้อินพุตข้อมูลจากเธรดและกระบวนการอื่น ๆ ได้ แต่อินพุตจะถูกประมวลผลโดยรันลูปที่ตรวจสอบแหล่งข้อมูลเหล่านั้นบนเธรดที่กำลังรันลูปรัน
- หมายความว่าบางครั้งฉันสามารถใช้ run loop เพื่อบล็อกเธรดได้ชั่วครั้งชั่วคราว
แน่นอน. ในความเป็นจริงการวนรอบการทำงานจะ "คงอยู่" ในตัวจัดการเหตุการณ์จนกว่าตัวจัดการเหตุการณ์นั้นจะกลับมา คุณสามารถเห็นสิ่งนี้ในแอปใดก็ได้ก็เพียงพอแล้ว ติดตั้งตัวจัดการสำหรับการดำเนินการ IO ใด ๆ (เช่นการกดปุ่ม) ที่สลีป คุณจะบล็อกลูปรันหลัก (และ UI ทั้งหมด) จนกว่าวิธีนั้นจะเสร็จสมบูรณ์
เช่นเดียวกับ run loop
ฉันขอแนะนำให้คุณอ่านเอกสารต่อไปนี้เกี่ยวกับ run loops:
https://developer.apple.com/documentation/foundation/nsrunloop
และวิธีใช้ภายในเธรด:
https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html#//apple_ref/doc/uid/10000057i-CH16-SW1