iOS के लिए Home API में, Swift में
Combine फ़्रेमवर्क
का इस्तेमाल करके, घर में मौजूद डिवाइस की स्थिति में होने वाले बदलावों को देखा जा सकता है. Home API में, स्ट्रक्चर, कमरों, डिवाइस के मेटाडेटा, और
डिवाइस की स्थिति में होने वाले बदलावों को, किसी भी एपीआई की मदद से देखा जा सकता है
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)")
}
}
किसी खास डिवाइस में होने वाले बदलावों को ट्रैक करना
किसी डिवाइस में होने वाले इन बदलावों से, यह कलेक्शन ट्रिगर होता है:
- कनेक्टिविटी की स्थिति
- डिवाइस का नाम
- कमरे की सदस्यता
- इस्तेमाल किए जा सकने वाले Trait का सेट
- इस्तेमाल किए जा सकने वाले टाइप का सेट
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!")
}
}
किसी डिवाइस पर मौजूद किसी खास Trait में होने वाले बदलावों को ट्रैक करना
डिवाइस और Home API के साथ काम करने वाले किसी भी Trait का इस्तेमाल करें. पूरी सूची देखने के लिए, देखें
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 के किसी भी ऐसे Matter डिवाइस टाइप का इस्तेमाल करें जो Home API के साथ काम करता हो. पूरी सूची देखने के लिए, 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
// Error getting FanDeviceType
return Empty<FanDeviceType, Never>().eraseToAnyPublisher()
}
.sink { [weak self] fanDeviceType in
self?.fanDeviceType = fanDeviceType
self?.updateTileInfo()
}
}