เหตุใดจึงต้องใช้การวนซ้ำเมื่อใช้ DispatchQueue.main.async ในเครื่องมือบรรทัดคำสั่งของ mac อย่างรวดเร็ว
ฉันพบเอกสารของ Apple เพื่อทำความเข้าใจว่าเหตุใดฉันจึงควรใช้ run loop เพื่อใช้งานในคิวการจัดส่งหลัก
ตามเอกสารที่แอปเปิ้ล ,
คิวการจัดส่งหลักคือคิวอนุกรมที่พร้อมใช้งานทั่วโลกซึ่งดำเนินการงานบนเธรดหลักของแอปพลิเคชัน คิวนี้ทำงานร่วมกับรันลูปของแอ็พพลิเคชัน (หากมีอยู่) เพื่อแทรกระหว่างการดำเนินการของงานที่อยู่ในคิวด้วยการดำเนินการของแหล่งเหตุการณ์อื่นที่แนบมากับลูปการรัน เนื่องจากรันบนเธรดหลักของแอปพลิเคชันของคุณคิวหลักจึงมักใช้เป็นจุดซิงโครไนซ์คีย์สำหรับแอปพลิเคชัน
แต่ถึงกระนั้นฉันก็ไม่เข้าใจว่า 'ทำไม' จึงจำเป็นต้องใช้ run loop ดูเหมือนว่า 'ต้องการ run loop เพราะต้องการ run loop' ฉันจะขอบคุณมากถ้ามีคนอธิบายฉันเกี่ยวกับเรื่องนี้ ขอขอบคุณ.
คำตอบ
เหตุใดฉันจึงควรใช้ run loop เพื่อใช้งานในคิวการจัดส่งหลัก
ปกติคุณไม่ทำเพราะคุณใช้อยู่แล้ว!
ในโครงการของแอพลิเคชันมีหลักคิววิ่งห่วงอยู่แล้ว ตัวอย่างเช่นโปรเจ็กต์แอป iOS นั้นไม่มีอะไรเลยนอกจากการเรียกใช้ UIApplicationMain ขนาดมหึมาซึ่งให้การวนรอบการทำงาน
นั่นคือวิธีที่สามารถนั่งรอให้ผู้ใช้ทำบางสิ่งได้ run loop คือเอ่อกำลังวิ่งอยู่ และการวนซ้ำ.
แต่กล่าวคือเครื่องมือบรรทัดคำสั่งของ Mac ไม่มีการวนรอบการทำงานอัตโนมัติ มันเรียกใช้ฟังก์ชันหลักและออกทันที หากคุณไม่จำเป็นต้องทำเช่นนั้นคุณจะต้องจัดหา run loop
DispatchQueue.main.async
คือเมื่อคุณมีโค้ดที่รันบนคิวพื้นหลังและคุณต้องการบล็อกโค้ดเฉพาะเพื่อเรียกใช้งานบนคิวหลักในโค้ดของคุณ
viewDidLoad
กำลังทำงานบนคิวหลักอยู่แล้วจึงมีเหตุผลเพียงเล็กน้อยที่จะใช้ DispatchQueue.main.asyncแต่ไม่จำเป็นต้องใช้มันผิดเสมอไป แต่จะเปลี่ยนลำดับการดำเนินการ
การปิด async ถูกจัดคิวให้ทำงานหลังจาก runloop ปัจจุบันเสร็จสมบูรณ์
ฉันไม่เข้าใจว่า 'ทำไม' จึงจำเป็นต้องใช้การวนซ้ำ
โดยทั่วไปไม่จำเป็นต้องใช้ run loop สำหรับแอพบรรทัดคำสั่ง คุณสามารถใช้ run loops ได้หากคุณมีความต้องการพิเศษ (เช่นคุณมี UI แบบไดนามิกที่ทำงานบางอย่างในขณะที่คุณรอการป้อนข้อมูลของผู้ใช้) แต่แอปบรรทัดคำสั่งส่วนใหญ่ไม่จำเป็นต้องใช้การวนซ้ำ
ตามที่เอกสารกล่าวไว้:
run loop คือลูปการประมวลผลเหตุการณ์ที่คุณใช้เพื่อจัดกำหนดการงานและประสานงานการรับเหตุการณ์ที่เข้ามา จุดประสงค์ของการรันลูปคือเพื่อให้เธรดของคุณไม่ว่างเมื่อมีงานที่ต้องทำและทำให้เธรดของคุณเข้าสู่โหมดสลีปเมื่อไม่มี
ดังนั้นหากคุณจำเป็นต้องให้แอปของคุณรอเหตุการณ์ที่เข้ามาหรือคุณกำลังส่งงานแบบอะซิงโครนัสระหว่างคิวให้ใช้การรันลูป แต่อย่างอื่นก็ไม่ต้องกังวล แอพบรรทัดคำสั่งส่วนใหญ่ไม่จำเป็นต้องใช้รันลูปเลย