งานเบื้องหลังและการรีเฟรช
จัดตารางงานเบื้องหลังด้วย 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การลงทะเบียนรับการแจ้งเตือนแบบพุช
- การจัดการข้อมูลการแจ้งเตือน
- งานเบื้องหลังและการรีเฟรช
- แอ็กชันและหมวดหมู่การแจ้งเตือน