در API های Home برای iOS، مشاهده تغییرات حالت در خانه با استفاده از چارچوب Combine در سوئیفت امکان پذیر است. مشاهده تغییرات در ساختارها، اتاقها، فراداده دستگاه و وضعیت دستگاه در APIهای Home میتواند با هر API با استفاده از HomeDevice
انجام شود. این کار با اشتراک ناشران که مقادیر رویدادهای ناهمزمان را افشا می کنند انجام می شود.
هنگامی که هر مورد در یک مجموعه اضافه، حذف یا اصلاح می شود، آخرین عکس فوری از مجموعه برگردانده می شود.
این به توسعه دهنده بستگی دارد که تغییرات خاص را با مقایسه این عکس فوری با یک نسخه قدیمی استنباط کند. برای این منظور می توان از فیلد id
ارائه شده برای هر نوع شی والد در Home API استفاده کرد.
نحوه باز کردن اشیاء اختیاری
وقتی یک شی اختیاری است، if let
یا guard
برای باز کردن ایمن شی استفاده کنید. استفاده نکنید !
چون !
هرگز نباید استفاده شود مگر اینکه توسعه دهنده به طور قطع بداند که شی نمی تواند صفر باشد.
پارامتر ورودی structureID
در مثال به صورت String?
، یعنی رشته ای است که اختیاری است و امکان صفر بودن را دارد. این تابع شی Structure
را بر اساس ورودی در structureID
پیدا می کند.
در اینجا نحوه مدیریت اشیاء اختیاری را به شما توصیه می کنیم:
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!")
}
}
ردیابی تغییرات به یک ویژگی خاص در یک دستگاه
از هر ویژگی پشتیبانی شده توسط دستگاه و APIهای Home استفاده کنید. برای فهرست کامل، 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)")
}
}
ردیابی تغییرات به یک نوع خاص در یک دستگاه
تغییرات زیر در نوع دستگاه این مجموعه را فعال می کند:
- تغییر در هر ویژگی در نوع دستگاه تولید شده
از هر نوع دستگاه Matter که توسط APIهای Home پشتیبانی می شود استفاده کنید. برای فهرست کامل، 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)")
}
}
اشتراک در رویدادها
در APIهای Home، رویدادها برای تشخیص تغییرات در وضعیت یک دستگاه استفاده میشوند.
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()
}
}