ใน Home API สําหรับ iOS คุณสามารถสังเกตการเปลี่ยนแปลงสถานะในบ้านได้โดยใช้เฟรมเวิร์ก Combine ใน Swift คุณสามารถสังเกตการเปลี่ยนแปลงโครงสร้าง ห้อง เมตาดาต้าของอุปกรณ์ และสถานะของอุปกรณ์ใน Home API โดยใช้ API ใดก็ได้โดยใช้ HomeDevice
ซึ่งทําได้โดยการติดตามผู้เผยแพร่โฆษณาที่แสดงค่าจากเหตุการณ์แบบไม่พร้อมกัน
เมื่อมีการเพิ่ม ลบ หรือแก้ไขรายการใดก็ตามในคอลเล็กชัน ระบบจะแสดงภาพรวมล่าสุดของคอลเล็กชัน
นักพัฒนาแอปจะเป็นผู้พิจารณาการเปลี่ยนแปลงที่เฉพาะเจาะจงโดยเปรียบเทียบภาพรวมนี้กับสำเนาเก่า คุณสามารถใช้ช่อง id
ที่ระบุไว้สำหรับออบเจ็กต์หลักแต่ละประเภทใน Home API เพื่อวัตถุประสงค์นี้
วิธีเลิกแพ็กออบเจ็กต์ที่ไม่บังคับ
เมื่อออบเจ็กต์เป็นออปชัน ให้ใช้ if let
หรือ guard
เพื่อเลิกแพ็กออบเจ็กต์อย่างปลอดภัย อย่าใช้ !
เนื่องจากไม่ควรใช้ !
เว้นแต่นักพัฒนาแอปจะทราบอย่างแน่ชัดว่าออบเจ็กต์ต้องไม่มีค่าเป็น Null
พารามิเตอร์อินพุต structureID
ในตัวอย่างนี้ได้รับการกำหนดเป็น String?
ซึ่งหมายความว่าเป็นสตริงที่ไม่บังคับและอาจมีค่าเป็น "ไม่มี" ฟังก์ชันนี้จะค้นหาออบเจ็กต์ Structure
โดยอิงตามอินพุตใน structureID
เราขอแนะนําให้คุณจัดการออบเจ็กต์ที่ไม่บังคับดังนี้
func structure(structureID: String?) -> Structure? {
guard let structureID else { return nil }
return structures.first { $0.id == structureID }
}
วิธีใช้ผู้เผยแพร่โฆษณา
ต่อไปนี้เป็นตัวอย่างพื้นฐานบางส่วนของการทำงานร่วมกับผู้เผยแพร่โฆษณาใน Home API สำหรับตัวอย่างต่อไปนี้ คุณต้องสร้างอินสแตนซ์ของ Home
var home: Home?
ก่อนเข้าถึงคอลเล็กชัน ให้ตรวจสอบว่าได้เปิดใช้งานคอลเล็กชันแล้ว เนื่องจากเป็นตัวเลือก
guard let home else { return nil }
ติดตามการเปลี่ยนแปลงโครงสร้าง
การเปลี่ยนแปลงต่อไปนี้ในโครงสร้างจะทริกเกอร์คอลเล็กชันนี้
- ชื่อโครงสร้าง
home.structures().batched()
.compactMap { $0.first(where: { $0.id = myStructureID} }
.removeDuplicates()
.sink { structure in
if let structure = structure {
print("Structure \(structure.id) updated to \(structure.name)")
}
}
ติดตามการเปลี่ยนแปลงในอุปกรณ์ที่ต้องการ
การเปลี่ยนแปลงต่อไปนี้ในอุปกรณ์จะทริกเกอร์คอลเล็กชันนี้
- สถานะการเชื่อมต่อ
- ชื่ออุปกรณ์
- การเป็นสมาชิกห้อง
- ชุดลักษณะที่รองรับ
- ชุดประเภทที่รองรับ
home.devices().batched()
.compactMap { deviceList -> HomeDevice? in
deviceList.filter { $0.name == "Bedroom Lamp"}.first
}
.removeDuplicates()
.sink { lampDevice in
if lampDevice != nil {
print("The bedroom lamp has changed!")
}
}
ติดตามการเปลี่ยนแปลงลักษณะเฉพาะในอุปกรณ์
ใช้แอตทริบิวต์ที่อุปกรณ์และ Home API รองรับ ดูรายการทั้งหมดได้ที่
Trait
device.types.subscribe(OnOffLightDeviceType.self)
.compactMap { $0.matterTraits.onOffTrait }
.removeDuplicates()
.sink { onOffState in
if let onOffState = onOffState {
print("Got new state update: \(onOffState.onOff)")
}
}
ติดตามการเปลี่ยนแปลงประเภทที่เจาะจงในอุปกรณ์
การเปลี่ยนแปลงประเภทอุปกรณ์ต่อไปนี้จะทริกเกอร์คอลเล็กชันนี้
- การเปลี่ยนแปลงลักษณะภายในประเภทอุปกรณ์ที่สร้างขึ้น
ใช้อุปกรณ์ Matter ประเภทใดก็ได้ที่ Home API รองรับ ดูรายการทั้งหมดได้ที่ DeviceType
device.types.subscribe(DimmableLightDeviceType.self)
.compactMap { $0.matterTraits.levelControlTrait }
.removeDuplicates()
.sink { dimmableLightDevice in
if let dimmableLightDevice = dimmableLightDevice
print("Got new state update! \(levelControlTrait.currentLevel)")
}
}
ติดตามการเปลี่ยนแปลงของห้องในโครงสร้าง
การเปลี่ยนแปลงต่อไปนี้ในแชทจะทริกเกอร์คอลเล็กชันนี้
- ชื่อห้อง
- จัดโครงสร้างการเป็นสมาชิก
หากต้องการติดตามเมื่อมีการเพิ่มหรือนำอุปกรณ์ออกจากห้อง ให้ใช้devices()
query
home.rooms().batched()
.sink { rooms in
print("Got a new updated set of rooms!")
for room in rooms {
print("Got room #\(room.name)")
}
}
สมัครรับเหตุการณ์
ใน Home API ระบบจะใช้เหตุการณ์เพื่อตรวจหาการเปลี่ยนแปลงสถานะของอุปกรณ์
เพื่อตรวจสอบสถานะของอุปกรณ์self.cancellable = self.device.types.subscribe(FanDeviceType.self)
.receive(on: DispatchQueue.main)
.catch { error in
Logger.error("Error getting FanDeviceType: \(error)")
return Empty<FanDeviceType, Never>().eraseToAnyPublisher()
}
.sink { [weak self] fanDeviceType in
self?.fanDeviceType = fanDeviceType
self?.updateTileInfo()
}
}