نظارت بر وضعیت دستگاه در iOS

در Home APIs ویژه iOS، مشاهده تغییرات وضعیت در خانه ازطریق استفاده از چارچوب Combine در Swift امکان‌پذیر است. مشاهده تغییرات در ساختارها، اتاق‌ها، فراداده دستگاه، و وضعیت دستگاه در Home APIs را می‌توان با هر API بااستفاده از HomeDevice انجام داد. این کار با اشتراک در ناشرانی که مقادیر را از رویدادهای ناهم‌زمان آشکار می‌کنند انجام می‌شود.

وقتی هر موردی در مجموعه‌ای اضافه، حذف، یا اصلاح شود، جدیدترین نمای فوری مجموعه برگردانده می‌شود.

توسعه‌دهنده باید با مقایسه این نمونه فوری با نسخه قدیمی‌تر، تغییرات خاص را استنباط کند. از فیلد id ارائه‌شده برای هر نوع شیء والد در Home APIs می‌توان برای این منظور استفاده کرد.

نحوه باز کردن بسته‌بندی اشیای اختیاری

وقتی شیء اختیاری است، از 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 APIs آورده شده است. برای مثال‌های زیر، نمونه‌ای از 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 APIs پشتیبانی می‌کنند استفاده کنید. برای مشاهده فهرست کامل، به 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 APIs استفاده کنید. برای دیدن فهرست کامل، 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()
  }
}