0Pricing
Swift Academy · บทเรียน

ตัวจัดตารางเวลาและการทำงานของเธรด

ควบคุมการทำงานด้วย receive(on:) และ subscribe(on:)

ตัวจัดตารางเวลาและการทำงานของเธรด เป็นบทเรียน Swift Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Swift Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน

ตัวจัดตารางเวลาในการรวมค่า

ตัวจัดตารางเวลาในการรวมค่ากำหนดว่า งานจะทำงาน เมื่อใด และ ที่ใด — เธรดหรือคิวใดจะเรียกใช้ตัวดำเนินการและส่งค่าให้ผู้สมัครรับ

การควบคุมตัวจัดตารางเวลาเป็นสิ่งสำคัญในการทำให้การอัปเดตส่วนติดต่อผู้ใช้อยู่บนเธรดหลัก และย้ายงานหนักออกจากเธรดนั้น

ตัวดำเนินการสำคัญสองตัว

การรวมค่ามีตัวดำเนินการสองตัวสำหรับควบคุมการทำงานบนเธรด:

  • subscribe(on:) — ควบคุมจุดเริ่มต้นของการสมัครรับและงานต้นทาง
  • receive(on:) — ควบคุมตำแหน่งที่ส่งค่าปลายทางลงมา

ตัวดำเนินการทั้งสองมีผลต่อคนละด้านของกระแสการประมวลผล

receive(on:)

receive(on:) ย้ายทุกสิ่งที่อยู่ หลัง ตัวดำเนินการนี้ไปยังตัวจัดตารางเวลาที่กำหนด การใช้งานที่พบบ่อยที่สุดคือกลับมายังคิวหลักก่อนอัปเดตส่วนติดต่อผู้ใช้

apiClient.fetchUser(id: 1)
    .receive(on: DispatchQueue.main)
    .sink { user in
        self.nameLabel.text = user.name
    }
    .store(in: &cancellables)

subscribe(on:)

subscribe(on:) ควบคุมเธรดที่ตัวเผยแพร่เริ่มสร้างผลลัพธ์ รวมถึงตำแหน่งที่ตัวดำเนินการต้นทางทำงาน ใช้เพื่อย้ายการเตรียมงานที่ใช้เวลามากออกจากเธรดหลัก

heavyPublisher
    .subscribe(on: DispatchQueue.global(qos: .userInitiated))
    .receive(on: DispatchQueue.main)
    .sink { result in
        self.update(result)
    }
    .store(in: &cancellables)

subscribe(on:) เทียบกับ receive(on:)

จดจำทิศทางการทำงานไว้:

  • subscribe(on:) มีผลต่อต้นทาง — ตำแหน่งที่งานเริ่มต้น
  • receive(on:) มีผลต่อปลายทาง — ตำแหน่งที่ส่งผลลัพธ์ออกมา

รูปแบบทั่วไปคือใช้ subscribe(on:) สำหรับงานเบื้องหลัง และใช้ receive(on:) สำหรับส่งผลลัพธ์ไปยังเธรดหลัก

DispatchQueue ในฐานะตัวจัดตารางเวลา

DispatchQueue นำโพรโทคอล Scheduler ไปใช้ DispatchQueue.main ส่งค่าบนเธรดหลัก ส่วนคิวส่วนกลางจะทำงานพร้อมกันในเบื้องหลัง

let background = DispatchQueue.global(qos: .background)

publisher
    .map { expensiveTransform($0) }
    .subscribe(on: background)
    .receive(on: DispatchQueue.main)
    .sink { self.render($0) }
    .store(in: &cancellables)

RunLoop ในฐานะตัวจัดตารางเวลา

RunLoop เป็นตัวจัดตารางเวลาอีกแบบหนึ่งที่ผูกกับลูปการทำงานของเธรด RunLoop.main ส่งค่าประสานกับเหตุการณ์ของส่วนติดต่อผู้ใช้ ซึ่งอาจมีความสำคัญต่อสิ่งต่าง ๆ เช่น ความตอบสนองขณะเลื่อน

timerPublisher
    .receive(on: RunLoop.main)
    .sink { _ in
        self.tick()
    }
    .store(in: &cancellables)

DispatchQueue เทียบกับ RunLoop

ทั้งสองแบบสามารถส่งค่าบนเธรดหลักได้ แต่มีความแตกต่างเล็กน้อย:

  • DispatchQueue.main — จัดตารางงานแม้ในช่วงติดตามการเลื่อน
  • RunLoop.main — เลื่อนงานออกไปขณะที่ลูปการทำงานอยู่ในโหมดติดตาม

สำหรับการอัปเดตส่วนติดต่อผู้ใช้ส่วนใหญ่หลังงานแบบไม่พร้อมกัน DispatchQueue.main เป็นค่าเริ่มต้นที่ปลอดภัยกว่า

ตัวดำเนินการจัดตารางเวลา

ตัวดำเนินการอย่าง debounce, throttle และ delay ล้วนรับอาร์กิวเมนต์ตัวจัดตารางเวลา ซึ่งกำหนดว่าคิวใดจะจัดการเรื่องเวลา

searchTextPublisher
    .debounce(for: .milliseconds(300), scheduler: DispatchQueue.main)
    .sink { query in
        self.runSearch(query)
    }
    .store(in: &cancellables)

ข้อผิดพลาดทั่วไปเกี่ยวกับเธรด

การอัปเดตส่วนติดต่อผู้ใช้นอกเธรดหลักทำให้แอปล่มหรือแสดงผลผิดพลาด หากคุณลืม receive(on: DispatchQueue.main) หลังตัวเผยแพร่เบื้องหลัง sink ของคุณอาจทำงานบนเธรดเบื้องหลัง

ส่งค่าที่เกี่ยวข้องกับส่วนติดต่อผู้ใช้ผ่านตัวจัดตารางเวลาหลักเสมอ

นำทุกอย่างมารวมกัน

กระแสการประมวลผลที่แข็งแกร่งจะเริ่มงานในเบื้องหลัง ประมวลผลที่นั่น แล้วส่งผลลัพธ์ไปยังเธรดหลักเพื่อแสดงผล

imageURLPublisher
    .subscribe(on: DispatchQueue.global())
    .flatMap { url in downloadImage(url) }
    .map { resize($0) }
    .receive(on: DispatchQueue.main)
    .sink { self.imageView.image = $0 }
    .store(in: &cancellables)

ตรวจสอบความเข้าใจ

ทดสอบความรู้เกี่ยวกับตัวจัดตารางเวลาของคุณ

สรุป

คุณได้เรียนรู้การควบคุมการทำงานบนเธรดในการรวมค่า:

  • subscribe(on:) — ตำแหน่งที่งานต้นทางเริ่มต้น
  • receive(on:) — ตำแหน่งที่ส่งผลลัพธ์ออกมา
  • DispatchQueue และ RunLoop ในฐานะตัวจัดตารางเวลา
  • ส่งการอัปเดตส่วนติดต่อผู้ใช้บนเธรดหลักเสมอ

การจัดตารางเวลาที่เหมาะสมช่วยให้แอปตอบสนองได้ดีและไม่ล่ม

คำถามที่พบบ่อย

บทเรียน “ตัวจัดตารางเวลาและการทำงานของเธรด” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ตัวจัดตารางเวลาและการทำงานของเธรด” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Swift Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ตัวจัดตารางเวลาและการทำงานของเธรด”

ควบคุมการทำงานด้วย receive(on:) และ subscribe(on:) คุณปฏิบัติ Swift Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Swift Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Swift Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “ตัวจัดตารางเวลาและการทำงานของเธรด” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Swift Academy นี้ได้ไหม

ได้ บทเรียน Swift Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การแปลงและรวมสตรีม
  2. ตัวจัดตารางเวลาและการทำงานของเธรด
  3. ตัวดำเนินการจัดการข้อผิดพลาด
  4. ผู้เผยแพร่และผู้รับข้อมูลแบบกำหนดเอง
← กลับไปที่ Swift Academy