في واجهات برمجة التطبيقات Home لنظام التشغيل iOS، يمكن رصد التغييرات في حالة المنزل من خلال استخدام إطار عمل Combine في Swift. يمكنك مراقبة التغييرات في المباني والغرف وبيانات الجهاز الوصفية وحالة الجهاز في واجهات برمجة التطبيقات لمنزل Google باستخدام أي واجهة برمجة تطبيقات تستخدم HomeDevice. ويتم ذلك من خلال الاشتراك في الناشرين الذين يعرضون قيمًا من الأحداث غير المتزامنة.
عند إضافة أي عنصر إلى مجموعة أو حذفه أو تعديله، يتم عرض أحدث لقطة للمجموعة.
ويعود للمطوّر تحديد التغييرات المحدّدة من خلال مقارنة هذه اللقطة بنسخة أقدم. يمكن استخدام الحقل id المتوفّر لكل نوع من أنواع العناصر الرئيسية في واجهات برمجة التطبيقات لمنزل Google لهذا الغرض.
كيفية إلغاء تغليف العناصر الاختيارية
عندما يكون أحد العناصر اختياريًا، استخدِم 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. بالنسبة إلى الأمثلة التالية، يجب إنشاء مثيل من 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. للاطّلاع على القائمة الكاملة، يُرجى الانتقال إلى
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 متوافق مع واجهات برمجة التطبيقات لمنزل Google. للاطّلاع على القائمة الكاملة، يُرجى الانتقال إلى 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()
}
}