En las APIs de Home para iOS, se pueden observar los cambios de estado en la casa a través del framework de Combine en Swift. Los cambios en las estructuras, las habitaciones, los metadatos de los dispositivos y el estado de los dispositivos en las APIs de Home se pueden observar con cualquier API que use HomeDevice
. Esto se hace suscribiéndose a publicadores que exponen valores de eventos asíncronos.
Cuando se agrega, borra o modifica cualquier elemento de una colección, se devuelve la instantánea más reciente de la colección.
Depende del desarrollador deducir los cambios específicos comparando esta instantánea con una copia anterior. Para ello, se puede usar el campo id
que se proporciona para cada tipo de objeto principal en las APIs de Home.
Cómo desenvolver objetos opcionales
Cuando un objeto es opcional, usa if let
o guard
para desenvolverlo de forma segura. No uses !
porque nunca se debe usar, a menos que el desarrollador sepa con certeza que el objeto no puede ser nulo.!
El parámetro de entrada structureID
en el ejemplo se define como String?
, lo que significa que es una cadena que es opcional y puede ser nula. Esta función encuentra el objeto Structure
según la entrada en structureID
.
A continuación, te mostramos cómo te recomendamos que manejes los objetos opcionales:
func structure(structureID: String?) -> Structure? {
guard let structureID else { return nil }
return structures.first { $0.id == structureID }
}
Cómo usar los publicadores
A continuación, se muestran algunos ejemplos básicos para trabajar con publicadores en las APIs de Home. Para los siguientes ejemplos, se debe crear una instancia de Home
.
var home: Home?
Antes de acceder a las colecciones, asegúrate de desempaquetarlas, ya que son opcionales:
guard let home else { return nil }
Cómo hacer un seguimiento de los cambios en una estructura
Los siguientes cambios en una estructura activan esta colección:
- Nombre de la estructura
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)")
}
}
Cómo hacer un seguimiento de los cambios en un dispositivo específico
Los siguientes cambios en un dispositivo activan esta colección:
- Estado de conectividad
- Nombre del dispositivo
- Membresía de sala
- El conjunto de traits compatibles
- El conjunto de tipos admitidos
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!")
}
}
Realiza un seguimiento de los cambios en un rasgo específico de un dispositivo
Usar cualquier rasgo admitido por el dispositivo y las APIs de Home Para obtener una lista completa, consulta 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)")
}
}
Realiza un seguimiento de los cambios en un tipo específico en un dispositivo
Los siguientes cambios en un tipo de dispositivo activan esta recopilación:
- Cambios en cualquier rasgo dentro del tipo de dispositivo generado
Usa cualquier tipo de dispositivo Matter compatible con las APIs de Home. Para obtener una lista completa, consulta 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)")
}
}
Realiza un seguimiento de los cambios en una habitación de una estructura
Los siguientes cambios en una habitación activan esta recopilación:
Para hacer un seguimiento de cuándo se agregan o quitan dispositivos de una habitación, usa la consulta devices()
.
home.rooms().batched()
.sink { rooms in
print("Got a new updated set of rooms!")
for room in rooms {
print("Got room #\(room.name)")
}
}
Suscríbete a eventos
En las APIs de Home, los eventos se usan para detectar cambios en el estado de 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()
}
}