Di Home API untuk iOS, pengamatan perubahan status di rumah dapat dilakukan
melalui penggunaan
framework Combine
di Swift. Perubahan pada struktur, ruangan, metadata perangkat, dan
status perangkat di Home API dapat diamati dengan API apa pun menggunakan
HomeDevice
. Hal ini dilakukan
dengan berlangganan ke penayang yang mengekspos 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 berupa nil.
Parameter input structureID
dalam contoh
ditentukan sebagai String?
, yang berarti parameter tersebut adalah string yang bersifat opsional dan berpotensi bernilai nol. Fungsi ini menemukan objek Structure
berdasarkan input di structureID
.
Berikut cara yang kami sarankan untuk menangani objek opsional:
func structure(structureID: String?) -> Structure? {
guard let structureID else { return nil }
return structures.first { $0.id == structureID }
}
Cara menggunakan penayang
Berikut adalah beberapa contoh dasar cara berinteraksi dengan penayang di Home
API. Untuk contoh berikut, instance Home
harus dibuat.
var home: Home?
Sebelum mengakses koleksi, pastikan untuk membuka bungkusnya karena bersifat opsional:
guard let home else { return nil }
Melacak perubahan pada struktur
Perubahan berikut pada struktur memicu pengumpulan ini:
- Nama struktur
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 pengumpulan ini:
- Status konektivitas
- Nama perangkat
- Keanggotaan Room
- 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 karakteristik 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 pengumpulan ini:
- Perubahan pada sifat apa pun dalam jenis perangkat yang dihasilkan
Gunakan jenis perangkat Matter apa pun yang didukung oleh Home API. Untuk
daftar lengkap, 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 ruang dalam struktur
Perubahan berikut pada ruang memicu pengumpulan ini:
Untuk melacak kapan perangkat ditambahkan atau dihapus dari ruangan, gunakan kueri devices()
.
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
Logger.error("Error getting FanDeviceType: \(error)")
return Empty<FanDeviceType, Never>().eraseToAnyPublisher()
}
.sink { [weak self] fanDeviceType in
self?.fanDeviceType = fanDeviceType
self?.updateTileInfo()
}
}