Cómo supervisar el estado del dispositivo en iOS

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:

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:

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:

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()
  }
}