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

งานเบื้องหลังและการรีเฟรช

จัดตารางงานเบื้องหลังด้วย BGTaskScheduler

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

เหตุผลที่มีงานเบื้องหลัง

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

import BackgroundTasks
// You request work; the system schedules it later
// at an opportune moment (charging, on Wi-Fi, etc.)

งานสองประเภท

มีงานอยู่สองประเภท ได้แก่ BGAppRefreshTask สำหรับการอัปเดตสั้น ๆ ที่เกิดขึ้นบ่อย (ระดับวินาที) และ BGProcessingTask สำหรับงานที่ใช้เวลานานและหนักกว่า (ระดับนาที) เช่น การบำรุงรักษาฐานข้อมูล โดยอาจกำหนดให้ต้องใช้พลังงานหรือเครือข่ายได้

import BackgroundTasks
// BGAppRefreshTask  -> quick content refresh
// BGProcessingTask  -> long maintenance, can require
//                      external power / network

การประกาศตัวระบุ

งานแต่ละงานต้องมีตัวระบุที่ไม่ซ้ำกัน ซึ่งคุณต้องระบุไว้ใน Info.plist ภายใต้ BGTaskSchedulerPermittedIdentifiers หากไม่ประกาศ การ register จะล้มเหลว ให้ใช้สตริงในรูปแบบ reverse-DNS

// Info.plist:
// BGTaskSchedulerPermittedIdentifiers = [
//   "com.example.app.refresh",
//   "com.example.app.cleanup"
// ]
let ids = "declare every identifier in Info.plist"
_ = ids

การ register ตัวจัดการ

เมื่อเปิดแอป ให้ register ตัวจัดการสำหรับตัวระบุแต่ละรายการด้วย BGTaskScheduler.shared.register ขั้นตอนนี้ต้องเกิดขึ้น ก่อน ที่แอปจะเปิดเสร็จ ตัวจัดการจะทำงานเมื่อระบบตัดสินใจเรียกใช้งานในภายหลัง

import BackgroundTasks
func registerTasks() {
    BGTaskScheduler.shared.register(
        forTaskWithIdentifier: "com.example.app.refresh",
        using: nil) { task in
        handleRefresh(task as! BGAppRefreshTask)
    }
}

การส่งคำขอ

การ register เพียงอย่างเดียวเป็นแค่การเชื่อมต่อตัวจัดการเท่านั้น หากต้องการขอให้ระบบเรียกใช้จริง ให้สร้าง BGAppRefreshTaskRequest ตั้งวันที่เริ่มต้นที่เร็วที่สุด แล้วเรียก submit ระบบจะถือว่าวันที่ดังกล่าวเป็นคำแนะนำ ไม่ใช่การรับประกัน

import BackgroundTasks
func scheduleRefresh() {
    let request = BGAppRefreshTaskRequest(
        identifier: "com.example.app.refresh")
    request.earliestBeginDate = Date(
        timeIntervalSinceNow: 15 * 60)
    try? BGTaskScheduler.shared.submit(request)
}

กำหนดเวลาใหม่เสมอ

คำขอที่ส่งแล้วจะทำงานได้มากที่สุดหนึ่งครั้ง หากต้องการให้อัปเดตต่อไป ตัวจัดการต้องส่งคำขอ ถัดไป ก่อนที่จะทำงานเสร็จ ควรกำหนดเวลาใหม่ก่อน แล้วจึงทำงาน เพื่อไม่ให้การหยุดทำงานระหว่างทางทำให้รอบการทำงานสิ้นสุด

import BackgroundTasks
func handleRefresh(_ task: BGAppRefreshTask) {
    scheduleRefresh() // queue the next run first
    // ... then perform this run's work
}

การแจ้งว่าทำงานเสร็จสิ้น

เมื่อทำงานเสร็จ คุณต้องเรียก task.setTaskCompleted(success:) การลืมเรียกใช้จะทำให้โควตางานเบื้องหลังสูญเปล่า และอาจทำให้งานในอนาคตได้รับลำดับความสำคัญต่ำลง ให้ส่งผลว่างานสำเร็จหรือไม่ เพื่อให้ระบบปรับการกำหนดเวลาได้

import BackgroundTasks
func handleRefresh(_ task: BGAppRefreshTask) {
    scheduleRefresh()
    Task {
        let ok = await fetchLatest()
        task.setTaskCompleted(success: ok)
    }
}
func fetchLatest() async -> Bool { true }

การเคารพตัวจัดการหมดเวลา

ระบบอาจเรียกคืนเวลาที่จัดสรรให้ก่อนกำหนด ให้ตั้งค่า task.expirationHandler เพื่อยกเลิกงานที่กำลังทำและเก็บกวาดทรัพยากร เพื่อให้จบการทำงานอย่างเรียบร้อยหากถูกตัดเวลา ให้ถือว่าสิ่งนี้เป็นสัญญาณเตือนกำหนดเวลา

import BackgroundTasks
func handle(_ task: BGAppRefreshTask) {
    let work = Task { await fetchLatest() }
    task.expirationHandler = {
        work.cancel() // stop before the OS suspends us
    }
}
func fetchLatest() async -> Bool { true }

งานประมวลผลพร้อมข้อกำหนด

สำหรับงานหนัก BGProcessingTaskRequest ช่วยให้คุณตั้งค่า requiresNetworkConnectivity และ requiresExternalPower ได้ ระบบจะรอจนกว่าเงื่อนไขเหล่านั้นจะเป็นจริง ดังนั้นงานที่ใช้เวลานานจึงสามารถทำงานขณะที่อุปกรณ์กำลังชาร์จในเวลากลางคืนและเชื่อมต่อ Wi-Fi

import BackgroundTasks
func scheduleCleanup() {
    let req = BGProcessingTaskRequest(
        identifier: "com.example.app.cleanup")
    req.requiresExternalPower = true
    req.requiresNetworkConnectivity = false
    try? BGTaskScheduler.shared.submit(req)
}

การทดสอบในตัวดีบัก

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

// In LLDB while paused:
// e -l objc -- (void)[[BGTaskScheduler sharedScheduler]
//   _simulateLaunchForTaskWithIdentifier:
//   @"com.example.app.refresh"]
let test = "force-launch task via LLDB"
_ = test

รอบการอัปเดตที่สมบูรณ์

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

import BackgroundTasks
func handleRefresh(_ task: BGAppRefreshTask) {
    scheduleRefresh()
    let work = Task { await fetchLatest() }
    task.expirationHandler = { work.cancel() }
    Task {
        let ok = await work.value
        task.setTaskCompleted(success: ok)
    }
}
func fetchLatest() async -> Bool { true }

ตรวจสอบความเข้าใจอย่างรวดเร็ว

ทบทวนวงจรชีวิตของงานอัปเดตที่ทำซ้ำ

สรุปทบทวน

คุณได้เรียนรู้การกำหนดเวลางานเบื้องหลังแล้ว:

  • BGAppRefreshTask สำหรับการอัปเดตสั้น ๆ และ BGProcessingTask สำหรับการบำรุงรักษาระยะยาวที่มีข้อกำหนดด้านพลังงานหรือเครือข่าย
  • ประกาศตัวระบุใน Info.plist, register ตัวจัดการเมื่อเปิดแอป และ submit คำขอพร้อม earliestBeginDate
  • กำหนดเวลาการทำงานครั้งถัดไปใหม่ภายในตัวจัดการ ตั้งค่า expirationHandler และเรียก setTaskCompleted เสมอ
  • บังคับเริ่มงานผ่าน LLDB เพื่อทดสอบ

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

บทเรียน “งานเบื้องหลังและการรีเฟรช” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “งานเบื้องหลังและการรีเฟรช”

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

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

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

บทเรียน “งานเบื้องหลังและการรีเฟรช” ใช้เวลานานแค่ไหน

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

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

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

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

  1. การลงทะเบียนรับการแจ้งเตือนแบบพุช
  2. การจัดการข้อมูลการแจ้งเตือน
  3. งานเบื้องหลังและการรีเฟรช
  4. แอ็กชันและหมวดหมู่การแจ้งเตือน
← กลับไปที่ Swift Academy