Di Home API untuk iOS, pengamatan perubahan status di rumah dapat
dilakukan melalui penggunaan
framework Combine
di Swift. Mengamati perubahan pada 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 mengekspos nilai dari peristiwa asinkron.
Saat item dalam koleksi ditambahkan, dihapus, atau diubah, snapshot terbaru koleksi akan ditampilkan.
Developer dapat 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 mengekstrak 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
tahu dengan pasti bahwa objek tidak boleh null.
Parameter input structureID
dalam contoh
ditentukan sebagai String?
, yang berarti string tersebut bersifat opsional dan memiliki
kemungkinan nol. Fungsi ini menemukan objek Structure
berdasarkan input di structureID
.
Berikut adalah cara yang kami rekomendasikan 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 penggunaan 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:
- 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 akan memicu koleksi ini:
- Status konektivitas
- Nama perangkat
- Langganan Ruang
- Kumpulan sifat 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 karakteristik apa pun yang didukung oleh perangkat dan Home API. Untuk mengetahui 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 akan 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 ruangan dalam struktur
Perubahan berikut pada ruang akan memicu koleksi 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()
}
}