ใน Home API สำหรับ iOS การสังเกตการเปลี่ยนแปลงสถานะในบ้านจะทำได้โดยใช้เฟรมเวิร์ก Combine ใน Swift
คุณสามารถสังเกตการเปลี่ยนแปลงในโครงสร้าง ห้อง ข้อมูลเมตาของอุปกรณ์ และ
สถานะอุปกรณ์ใน Home API ได้ด้วย API ใดก็ได้โดยใช้
HomeDevice
โดยทำได้ด้วยการติดตามผู้เผยแพร่โฆษณาที่แสดงค่าจากเหตุการณ์แบบไม่พร้อมกัน
เมื่อมีการเพิ่ม ลบ หรือแก้ไขรายการใดก็ตามในคอลเล็กชัน ระบบจะแสดงภาพรวมล่าสุด ของคอลเล็กชัน
นักพัฒนาซอฟต์แวร์ต้องอนุมานการเปลี่ยนแปลงที่เฉพาะเจาะจงโดยการเปรียบเทียบ
สแนปชอตนี้กับสำเนาที่เก่ากว่า คุณใช้id
ฟิลด์ที่ระบุไว้สำหรับ
ออบเจ็กต์หลักแต่ละประเภทใน Home API
เพื่อวัตถุประสงค์นี้ได้
วิธีคลี่ออบเจ็กต์ที่ไม่บังคับ
เมื่อออบเจ็กต์เป็นแบบไม่บังคับ ให้ใช้ if let
หรือ guard
เพื่อแกะออบเจ็กต์อย่างปลอดภัย
อย่าใช้ !
เนื่องจากไม่ควรใช้ !
เว้นแต่ว่านักพัฒนาแอปจะทราบอย่างแน่นอนว่าออบเจ็กต์ต้องไม่เป็นค่าว่าง
พารามิเตอร์อินพุต 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)")
}
}
ติดตามการเปลี่ยนแปลงในประเภทที่เฉพาะเจาะจงบนอุปกรณ์
การเปลี่ยนแปลงประเภทอุปกรณ์ต่อไปนี้จะทริกเกอร์คอลเล็กชันนี้
- การเปลี่ยนแปลงลักษณะใดๆ ภายในประเภท อุปกรณ์ที่สร้างขึ้น
ใช้อุปกรณ์ประเภทใดก็ได้ที่ MatterHome 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()
คำค้นหา
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()
}
}