ใน Home API สำหรับ iOS การสังเกตการเปลี่ยนแปลงสถานะในบ้านสามารถทำได้
ผ่านการใช้
เฟรมเวิร์ก Combine
ใน Swift การสังเกตการเปลี่ยนแปลงในโครงสร้าง ห้อง ข้อมูลเมตาของอุปกรณ์ และ
สถานะอุปกรณ์ใน Home API สามารถทำได้ด้วย API ใดก็ได้โดยใช้
HomeDevice ซึ่งทำได้โดยการ สมัครรับข้อมูล จาก ผู้เผยแพร่ ที่แสดงค่าจากเหตุการณ์แบบไม่พร้อมกัน
เมื่อมีการเพิ่ม ลบ หรือแก้ไขรายการใดก็ตามในคอลเล็กชัน ระบบจะแสดงผลสแนปชอตล่าสุดของคอลเล็กชัน
นักพัฒนาแอปต้องอนุมานการเปลี่ยนแปลงที่เฉพาะเจาะจงด้วยการเปรียบเทียบสแนปชอตนี้กับสำเนาที่เก่ากว่า คุณสามารถใช้ช่อง id ที่ระบุไว้สำหรับ
ออบเจ็กต์ระดับบนแต่ละประเภทใน Home API
เพื่อวัตถุประสงค์นี้ได้
วิธีแกะออบเจ็กต์ที่เป็นตัวเลือก
เมื่อออบเจ็กต์เป็นตัวเลือก ให้ใช้ if let หรือ guard เพื่อแกะออบเจ็กต์อย่างปลอดภัย อย่าใช้ ! เนื่องจากไม่ควรใช้ ! เว้นแต่ว่านักพัฒนาแอปจะทราบอย่างแน่นอนว่าออบเจ็กต์ไม่สามารถเป็น nil ได้
พารามิเตอร์อินพุต structureID ในตัวอย่างกำหนดเป็น String? ซึ่งหมายความว่าเป็นสตริงที่เป็นตัวเลือกและอาจเป็น nil ได้ ฟังก์ชันนี้จะค้นหาออบเจ็กต์ 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
// Error getting FanDeviceType
return Empty<FanDeviceType, Never>().eraseToAnyPublisher()
}
.sink { [weak self] fanDeviceType in
self?.fanDeviceType = fanDeviceType
self?.updateTileInfo()
}
}