การโพสต์และสังเกตการแจ้งเตือน
ส่งและรับเหตุการณ์ทั่วทั้งแอป
การโพสต์และสังเกตการแจ้งเตือน เป็นบทเรียน Swift Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Swift Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน
NotificationCenter
NotificationCenter เป็นกลไกกระจายข่าวสาร ส่วนหนึ่งของ app ส่งการแจ้งเตือน และผู้สังเกตการณ์จำนวนเท่าใดก็ได้ตอบสนอง โดยผู้ส่งและผู้รับไม่จำเป็นต้องรู้จักกัน
ศูนย์เริ่มต้น
โค้ดส่วนใหญ่ใช้ NotificationCenter.default ซึ่งเป็นศูนย์กลางที่ใช้ร่วมกันสำหรับส่งการแจ้งเตือนไปทั่วกระบวนการ
import Foundation
let center = NotificationCenter.default
print("Using the default notification center")กำหนดชื่อการแจ้งเตือน
การแจ้งเตือนระบุด้วย Notification.Name การกำหนดค่าคงที่จะช่วยป้องกันการพิมพ์ผิดและรวมชื่อไว้ที่เดียว
import Foundation
extension Notification.Name {
static let dataUpdated = Notification.Name("dataUpdated")
}
print("Defined a notification name")การส่งการแจ้งเตือน
post(name:object:) จะกระจายการแจ้งเตือน โดยทั่วไป object คือผู้ส่งหรือเป็น nil
import Foundation
let center = NotificationCenter.default
let name = Notification.Name("ping")
center.post(name: name, object: nil)
print("Posted a notification")การเพิ่มตัวเฝ้าดูแบบโคลเชอร์
addObserver(forName:object:queue:using:) แบบใช้บล็อกจะเรียกใช้โคลเชอร์ทุกครั้งที่การแจ้งเตือนทำงาน และส่งคืน token
import Foundation
let center = NotificationCenter.default
let name = Notification.Name("ping")
let token = center.addObserver(forName: name, object: nil, queue: .main) { _ in
print("Observer fired")
}
center.post(name: name, object: nil)
_ = tokenตัวเฝ้าดูแบบซีเลกเตอร์
API แบบดั้งเดิมจะใช้เป้าหมายร่วมกับ #selector โดยเมธอดจะได้รับอาร์กิวเมนต์ชนิด Notification
import Foundation
class Watcher: NSObject {
func start() {
NotificationCenter.default.addObserver(
self, selector: #selector(handle(_:)),
name: Notification.Name("ping"), object: nil)
}
@objc func handle(_ n: Notification) { print("Handled") }
}
Watcher().start()การรับการแจ้งเตือน
โคลเชอร์หรือตัวเฝ้าดูแบบเมธอดจะได้รับค่า Notification ซึ่งมีชื่อ อ็อบเจกต์ และ userInfo ของการแจ้งเตือน
import Foundation
let center = NotificationCenter.default
let name = Notification.Name("event")
_ = center.addObserver(forName: name, object: nil, queue: nil) { note in
print("Got: \(note.name.rawValue)")
}
center.post(name: name, object: nil)การกระจายจากหนึ่งไปหลาย
ตัวเฝ้าดูหลายตัวสามารถ listen ชื่อเดียวกันได้ การเรียก post เพียงครั้งเดียวจะแจ้งเตือนตัวเฝ้าดูทั้งหมด
import Foundation
let center = NotificationCenter.default
let name = Notification.Name("refresh")
_ = center.addObserver(forName: name, object: nil, queue: nil) { _ in print("A") }
_ = center.addObserver(forName: name, object: nil, queue: nil) { _ in print("B") }
center.post(name: name, object: nil)การกรองตามอ็อบเจกต์
การส่งค่า object ที่ไม่ใช่ nil ให้กับ addObserver จะกรองการแจ้งเตือน ทำให้ตัวเฝ้าดูทำงานเฉพาะเมื่อมีการส่งจากผู้ส่งรายนั้น
import Foundation
let center = NotificationCenter.default
let sender = NSObject()
let name = Notification.Name("scoped")
_ = center.addObserver(forName: name, object: sender, queue: nil) { _ in
print("Only from sender")
}
center.post(name: name, object: sender)การแจ้งเตือนของระบบ
ระบบจะส่งการแจ้งเตือนที่มีมาให้ในตัวจำนวนมาก เช่น เหตุการณ์เกี่ยวกับแป้นพิมพ์หรือวงจรชีวิตของแอป ซึ่งคุณสามารถเฝ้าดูได้ด้วยวิธีเดียวกัน
import Foundation
// e.g. UIApplication.didEnterBackgroundNotification on iOS
let custom = Notification.Name("appReady")
_ = NotificationCenter.default.addObserver(forName: custom, object: nil, queue: nil) { _ in
print("App ready")
}ควรใช้เมื่อใด
NotificationCenter เหมาะกับเหตุการณ์ระดับ глобัลที่มีผู้รับหลายราย โดยผู้ส่งและผู้รับควรแยกออกจากกัน สำหรับการเชื่อมโยงแบบหนึ่งต่อหนึ่งที่แน่นแฟ้น delegate มักอธิบายได้ชัดเจนกว่า
import Foundation
// Broadcast a global event many parts of the app care about.
let name = Notification.Name("userLoggedOut")
NotificationCenter.default.post(name: name, object: nil)
print("Broadcast logout")ตรวจสอบความเข้าใจ
NotificationCenter.default.post(name:object:) ทำหน้าที่อะไร
ทบทวน
NotificationCenter.default แยกผู้ส่งและผู้รับออกจากกัน คุณกำหนด Notification.Name แล้วเรียก post จากนั้นใช้ addObserver ร่วมกับโคลเชอร์หรือซีเลกเตอร์เพื่อโต้ตอบ รองรับการกระจายจากหนึ่งไปหลายและการกรองตามอ็อบเจกต์ ต่อไปคือการส่งข้อมูลใน userInfo
คำถามที่พบบ่อย
บทเรียน “การโพสต์และสังเกตการแจ้งเตือน” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การโพสต์และสังเกตการแจ้งเตือน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Swift Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การโพสต์และสังเกตการแจ้งเตือน”
ส่งและรับเหตุการณ์ทั่วทั้งแอป คุณปฏิบัติ Swift Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Swift Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Swift Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “การโพสต์และสังเกตการแจ้งเตือน” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Swift Academy นี้ได้ไหม
ได้ บทเรียน Swift Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การโพสต์และสังเกตการแจ้งเตือน
- ข้อมูลส่วนเพิ่มเติม userInfo ของการแจ้งเตือน
- การนำตัวสังเกตออกอย่างปลอดภัย
- ทางเลือกแทนรูปแบบตัวสังเกต