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