เหตุใดจึงต้องใช้การวนซ้ำเมื่อใช้ DispatchQueue.main.async ในเครื่องมือบรรทัดคำสั่งของ mac อย่างรวดเร็ว

Aug 15 2020

ฉันพบเอกสารของ Apple เพื่อทำความเข้าใจว่าเหตุใดฉันจึงควรใช้ run loop เพื่อใช้งานในคิวการจัดส่งหลัก

ตามเอกสารที่แอปเปิ้ล ,

คิวการจัดส่งหลักคือคิวอนุกรมที่พร้อมใช้งานทั่วโลกซึ่งดำเนินการงานบนเธรดหลักของแอปพลิเคชัน คิวนี้ทำงานร่วมกับรันลูปของแอ็พพลิเคชัน (หากมีอยู่) เพื่อแทรกระหว่างการดำเนินการของงานที่อยู่ในคิวด้วยการดำเนินการของแหล่งเหตุการณ์อื่นที่แนบมากับลูปการรัน เนื่องจากรันบนเธรดหลักของแอปพลิเคชันของคุณคิวหลักจึงมักใช้เป็นจุดซิงโครไนซ์คีย์สำหรับแอปพลิเคชัน

แต่ถึงกระนั้นฉันก็ไม่เข้าใจว่า 'ทำไม' จึงจำเป็นต้องใช้ run loop ดูเหมือนว่า 'ต้องการ run loop เพราะต้องการ run loop' ฉันจะขอบคุณมากถ้ามีคนอธิบายฉันเกี่ยวกับเรื่องนี้ ขอขอบคุณ.

คำตอบ

1 matt Aug 15 2020 at 19:37

เหตุใดฉันจึงควรใช้ run loop เพื่อใช้งานในคิวการจัดส่งหลัก

ปกติคุณไม่ทำเพราะคุณใช้อยู่แล้ว!

ในโครงการของแอพลิเคชันมีหลักคิววิ่งห่วงอยู่แล้ว ตัวอย่างเช่นโปรเจ็กต์แอป iOS นั้นไม่มีอะไรเลยนอกจากการเรียกใช้ UIApplicationMain ขนาดมหึมาซึ่งให้การวนรอบการทำงาน

นั่นคือวิธีที่สามารถนั่งรอให้ผู้ใช้ทำบางสิ่งได้ run loop คือเอ่อกำลังวิ่งอยู่ และการวนซ้ำ.

แต่กล่าวคือเครื่องมือบรรทัดคำสั่งของ Mac ไม่มีการวนรอบการทำงานอัตโนมัติ มันเรียกใช้ฟังก์ชันหลักและออกทันที หากคุณไม่จำเป็นต้องทำเช่นนั้นคุณจะต้องจัดหา run loop

1 KavinduChathuranga Aug 15 2020 at 18:52

DispatchQueue.main.async คือเมื่อคุณมีโค้ดที่รันบนคิวพื้นหลังและคุณต้องการบล็อกโค้ดเฉพาะเพื่อเรียกใช้งานบนคิวหลัก

ในโค้ดของคุณviewDidLoadกำลังทำงานบนคิวหลักอยู่แล้วจึงมีเหตุผลเพียงเล็กน้อยที่จะใช้ DispatchQueue.main.async

แต่ไม่จำเป็นต้องใช้มันผิดเสมอไป แต่จะเปลี่ยนลำดับการดำเนินการ

การปิด async ถูกจัดคิวให้ทำงานหลังจาก runloop ปัจจุบันเสร็จสมบูรณ์

Rob Aug 15 2020 at 23:56

ฉันไม่เข้าใจว่า 'ทำไม' จึงจำเป็นต้องใช้การวนซ้ำ

โดยทั่วไปไม่จำเป็นต้องใช้ run loop สำหรับแอพบรรทัดคำสั่ง คุณสามารถใช้ run loops ได้หากคุณมีความต้องการพิเศษ (เช่นคุณมี UI แบบไดนามิกที่ทำงานบางอย่างในขณะที่คุณรอการป้อนข้อมูลของผู้ใช้) แต่แอปบรรทัดคำสั่งส่วนใหญ่ไม่จำเป็นต้องใช้การวนซ้ำ

ตามที่เอกสารกล่าวไว้:

run loop คือลูปการประมวลผลเหตุการณ์ที่คุณใช้เพื่อจัดกำหนดการงานและประสานงานการรับเหตุการณ์ที่เข้ามา จุดประสงค์ของการรันลูปคือเพื่อให้เธรดของคุณไม่ว่างเมื่อมีงานที่ต้องทำและทำให้เธรดของคุณเข้าสู่โหมดสลีปเมื่อไม่มี

ดังนั้นหากคุณจำเป็นต้องให้แอปของคุณรอเหตุการณ์ที่เข้ามาหรือคุณกำลังส่งงานแบบอะซิงโครนัสระหว่างคิวให้ใช้การรันลูป แต่อย่างอื่นก็ไม่ต้องกังวล แอพบรรทัดคำสั่งส่วนใหญ่ไม่จำเป็นต้องใช้รันลูปเลย