Nelle API Home per iOS, l'osservazione delle modifiche allo stato della casa è resa
possibile tramite l'utilizzo del
framework Combine
in Swift. L'osservazione delle modifiche a strutture, stanze, metadati dei dispositivi e stato dei dispositivi nelle API Home può essere eseguita con qualsiasi API utilizzando HomeDevice. Ciò avviene
sottoscrivendo i publisher che espongono i valori degli eventi asincroni.
Quando un elemento di una raccolta viene aggiunto, eliminato o modificato, viene restituita l'ultima istantanea della raccolta.
Spetta allo sviluppatore dedurre le modifiche specifiche confrontando questa istantanea con una copia precedente. A questo scopo, puoi utilizzare il campo id fornito per
ogni tipo di oggetto principale nelle API Home.
Come scartare gli oggetti opzionali
Quando un oggetto è facoltativo, utilizza if let o guard per decomprimere in sicurezza
l'oggetto. Non utilizzare ! perché ! non deve mai essere utilizzato a meno che lo sviluppatore
non sappia con certezza che l'oggetto non può essere nullo.
Il parametro di input structureID nell'esempio è
definito come String?, il che significa che è una stringa facoltativa che può
essere nulla. Questa funzione trova l'oggetto Structure
in base all'input in structureID.
Ecco come ti consigliamo di gestire gli oggetti facoltativi:
func structure(structureID: String?) -> Structure? {
guard let structureID else { return nil }
return structures.first { $0.id == structureID }
}
Come utilizzare gli editori
Di seguito sono riportati alcuni esempi di base di utilizzo degli editori nelle API Home. Per gli esempi seguenti, deve essere creata un'istanza di Home.
var home: Home?
Prima di accedere alle raccolte, assicurati di decomprimerle, poiché sono facoltative:
guard let home else { return nil }
Tenere traccia delle modifiche apportate a una struttura
Questa raccolta viene attivata dalle seguenti modifiche a una struttura:
- Nome della struttura
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)")
}
}
Monitorare le modifiche a un dispositivo specifico
Le seguenti modifiche a un dispositivo attivano questa raccolta:
- Stato della connettività
- Nome del dispositivo
- Abbonamento a Room
- Il set di trait supportati
- Il set di tipi supportati
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!")
}
}
Monitorare le modifiche a una caratteristica specifica su un dispositivo
Utilizza qualsiasi tratto supportato dal dispositivo e dalle API Home. Per un elenco completo, vedi
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)")
}
}
Monitorare le modifiche a un tipo specifico su un dispositivo
Le seguenti modifiche a un tipo di dispositivo attivano questa raccolta:
- Modifiche a qualsiasi caratteristica all'interno del tipo di dispositivo generato
Utilizza qualsiasi tipo di dispositivo Matter supportato dalle API Home. Per
un elenco completo, vedi
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)")
}
}
Monitorare le modifiche apportate a una stanza in una struttura
I seguenti cambiamenti a una stanza attivano questa raccolta:
Per monitorare quando i dispositivi vengono aggiunti o rimossi da una stanza, utilizza la query devices().
home.rooms().batched()
.sink { rooms in
print("Got a new updated set of rooms!")
for room in rooms {
print("Got room #\(room.name)")
}
}
Iscriviti agli eventi
Nelle API Home, gli eventi vengono utilizzati per rilevare le modifiche allo stato di un dispositivo.
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()
}
}