Di Home API untuk iOS, pengamatan perubahan status di rumah dapat dilakukan
melalui penggunaan
framework Combine
di Swift. Pengamatan perubahan dalam struktur, ruangan, metadata perangkat, dan
status perangkat di Home API dapat dilakukan dengan API apa pun menggunakan
HomeDevice. Hal ini dilakukan dengan berlangganan ke penayang yang menampilkan nilai dari peristiwa asinkron.
Saat item apa pun dalam koleksi ditambahkan, dihapus, atau diubah, snapshot terbaru koleksi akan ditampilkan.
Developer harus menyimpulkan perubahan tertentu dengan membandingkan snapshot ini dengan salinan yang lebih lama. Kolom id yang disediakan untuk
setiap jenis objek induk di Home API
dapat digunakan untuk tujuan ini.
Cara membuka objek opsional
Jika objek bersifat opsional, gunakan if let atau guard untuk membuka objek dengan aman. Jangan gunakan ! karena ! tidak boleh digunakan kecuali jika developer yakin bahwa objek tidak boleh null.
Parameter input structureID dalam contoh ini ditentukan sebagai String?, yang berarti parameter ini adalah string yang bersifat opsional dan dapat bernilai null. Fungsi ini menemukan objek Structure berdasarkan input di structureID.
Berikut cara menangani objek opsional yang kami sarankan:
func structure(structureID: String?) -> Structure? {
guard let structureID else { return nil }
return structures.first { $0.id == structureID }
}
Cara menggunakan penayang
Berikut beberapa contoh dasar cara menggunakan penayang di Home API. Untuk contoh berikut, instance Home harus dibuat.
var home: Home?
Sebelum mengakses koleksi, pastikan untuk membukanya karena bersifat opsional:
guard let home else { return nil }
Melacak perubahan pada struktur
Perubahan berikut pada struktur memicu koleksi ini:
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)")
}
}
Melacak perubahan pada perangkat tertentu
Perubahan berikut pada perangkat memicu koleksi ini:
- Status konektivitas
- Nama perangkat
- Keanggotaan ruangan
- Kumpulan trait yang didukung
- Kumpulan jenis yang didukung
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!")
}
}
Melacak perubahan pada trait tertentu di perangkat
Gunakan trait apa pun yang didukung oleh perangkat dan Home API. Untuk daftar lengkapnya, lihat
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)")
}
}
Melacak perubahan pada jenis tertentu di perangkat
Perubahan berikut pada jenis perangkat memicu koleksi ini:
- Perubahan pada trait apa pun dalam jenis perangkat yang dihasilkan
Gunakan jenis perangkat Matter apa pun yang didukung oleh Home API. Untuk
daftar lengkapnya, lihat
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)")
}
}
Melacak perubahan pada ruangan dalam struktur
Perubahan berikut pada ruangan memicu koleksi ini:
- Nama ruangan
- Keanggotaan struktur
Untuk melacak kapan perangkat ditambahkan atau dihapus dari ruangan, gunakan devices()
kueri.
home.rooms().batched()
.sink { rooms in
print("Got a new updated set of rooms!")
for room in rooms {
print("Got room #\(room.name)")
}
}
Berlangganan peristiwa
Di Home API, peristiwa digunakan untuk mendeteksi perubahan status perangkat.
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()
}
}