iOS के लिए Home API में, होम की स्थिति में हुए बदलावों को देखने के लिए, Swift में Combine फ़्रेमवर्क का इस्तेमाल किया जाता है. Home के एपीआई में स्ट्रक्चर, कमरों, डिवाइस के मेटाडेटा, और डिवाइस की स्थिति में हुए बदलावों को देखने के लिए, HomeDevice
का इस्तेमाल करके किसी भी एपीआई का इस्तेमाल किया जा सकता है. ऐसा करने के लिए, असाइनॉन्स इवेंट से वैल्यू दिखाने वाले पब्लिशर की सदस्यता लें.
जब किसी कलेक्शन में कोई आइटम जोड़ा जाता है, मिटाया जाता है या उसमें बदलाव किया जाता है, तो कलेक्शन का नया स्नैपशॉट दिखता है.
इस स्नैपशॉट की तुलना किसी पुरानी कॉपी से करके, डेवलपर यह तय करता है कि कौनसे बदलाव किए गए हैं. इस काम के लिए, Home API में हर पैरंट ऑब्जेक्ट टाइप के लिए दिए गए id
फ़ील्ड का इस्तेमाल किया जा सकता है.
वैकल्पिक ऑब्जेक्ट को अनरैप करने का तरीका
अगर कोई ऑब्जेक्ट ज़रूरी नहीं है, तो उसे सुरक्षित तरीके से खोलने के लिए 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)")
}
}
किसी खास डिवाइस में किए गए बदलावों को ट्रैक करना
किसी डिवाइस में ये बदलाव होने पर, यह कलेक्शन ट्रिगर होता है:
- कनेक्टिविटी की स्थिति
- डिवाइस का नाम
- Room की पैसे चुकाकर ली जाने वाली सदस्यता
- इस्तेमाल किए जा सकने वाले ट्रेट्स का सेट
- इस्तेमाल किए जा सकने वाले टाइप का सेट
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 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()
}
}