iOS पर डिवाइस की स्थिति पर नज़र रखना

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)")
    }
  }

किसी खास डिवाइस में होने वाले बदलावों को ट्रैक करना

किसी डिवाइस में होने वाले इन बदलावों से, यह कलेक्शन ट्रिगर होता है:

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()
  }
}