در Home APIs ویژه iOS، مشاهده تغییرات وضعیت در خانه ازطریق استفاده از
چارچوب Combine
در Swift امکانپذیر است. مشاهده تغییرات در ساختارها، اتاقها، فراداده دستگاه، و وضعیت دستگاه در Home APIs را میتوان با هر API بااستفاده از
HomeDevice انجام داد. این کار با اشتراک در ناشرانی که مقادیر را از رویدادهای ناهمزمان آشکار میکنند انجام میشود.
وقتی هر موردی در مجموعهای اضافه، حذف، یا اصلاح شود، جدیدترین نمای فوری مجموعه برگردانده میشود.
توسعهدهنده باید با مقایسه این
نمونه فوری با نسخه قدیمیتر، تغییرات خاص را استنباط کند. از فیلد id ارائهشده برای
هر نوع شیء والد در Home APIs
میتوان برای این منظور استفاده کرد.
نحوه باز کردن بستهبندی اشیای اختیاری
وقتی شیء اختیاری است، از 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
APIs آورده شده است. برای مثالهای زیر، نمونهای از 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!")
}
}
پیگیری تغییرات ویژگی خاص در دستگاه
از هر مشخصهای که دستگاه و Home APIs پشتیبانی میکنند استفاده کنید. برای مشاهده فهرست کامل، به
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 پشتیبانیشده توسط Home APIs استفاده کنید. برای
دیدن فهرست کامل،
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»، از رویدادها برای تشخیص تغییرات در وضعیت دستگاه استفاده میشود.
self.cancellable = self.device.types.subscribe(FanDeviceType.self)
.receive(on: DispatchQueue.main)
.catch { error in
// Error getting FanDeviceType
return Empty<FanDeviceType, Never>().eraseToAnyPublisher()
}
.sink { [weak self] fanDeviceType in
self?.fanDeviceType = fanDeviceType
self?.updateTileInfo()
}
}