在 iOS 適用的 Home API 中,您可以使用 Swift 的 Combine 架構,觀察住家狀態的變化。如要透過 Home API 觀察結構、房間、裝置中繼資料和裝置狀態的變化,可以使用任何 API 搭配 HomeDevice
。方法是訂閱發布商,從非同步事件公開值。
當集合中的任何項目新增、刪除或修改時,系統會傳回集合的最新快照。
開發人員必須比較這個快照與舊副本,才能推斷具體變更。您可以使用 id
欄位,為 Home API 中的每個父項物件類型設定這個用途。
如何取消包裝選用物件
如果物件為選用,請使用 if let
或 guard
安全地解除包裝物件。請勿使用 !
,因為除非開發人員確定物件不得為空值,否則絕不應使用 !
。
範例中的輸入參數 structureID
定義為 String?
,表示這是選用字串,且可能為空值。這個函式會根據 structureID
中的輸入內容,找出 Structure
物件。
建議您按照下列方式處理選用物件:
func structure(structureID: String?) -> Structure? {
guard let structureID else { return nil }
return structures.first { $0.id == structureID }
}
如何使用發布商
以下是使用 Home API 處理發布者的基本範例。在下列範例中,必須建立 Home
的執行個體。
var home: Home?
存取集合前,請務必先解除包裝,因為集合是選用項目:
guard let home else { return nil }
追蹤結構的變更
結構發生下列變更時,系統會觸發這項集合:
- 結構名稱
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)")
}
}
追蹤特定裝置的變更
裝置發生下列變更時,系統會觸發收集作業:
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!")
}
}
追蹤裝置上特定特徵的變更
使用裝置和 Google Home API 支援的任何特徵。如需完整清單,請參閱 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)")
}
}
追蹤裝置上特定類型的變更
裝置類型發生下列變更時,系統會觸發這項收集作業:
- 產生的裝置類型中任何特徵的變更
使用 Home API 支援的任何 Matter 裝置類型。如需完整清單,請參閱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)")
}
}
追蹤結構中聊天室的變更
如果會議室發生下列變更,系統就會觸發這項收集作業:
如要追蹤裝置新增至房間或從房間移除的時間,請使用devices()
查詢。
home.rooms().batched()
.sink { rooms in
print("Got a new updated set of rooms!")
for room in rooms {
print("Got room #\(room.name)")
}
}
訂閱活動
在 Home API 中,事件用於偵測裝置狀態的變化。
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()
}
}