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

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

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

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

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

وقتی یک شیء اختیاری است، if let یا guard برای باز کردن ایمن شیء استفاده کنید. از ! استفاده نکنید زیرا ! هرگز نباید استفاده شود مگر اینکه توسعه‌دهنده مطمئن باشد که شیء نمی‌تواند تهی باشد.

پارامتر ورودی structureID در مثال به صورت String? تعریف شده است، به این معنی که یک رشته اختیاری است و امکان تهی بودن را نیز دارد. این تابع شیء Structure را بر اساس ورودی در structureID پیدا می‌کند.

در اینجا نحوه‌ی مدیریت اشیاء اختیاری را به شما توصیه می‌کنیم:

func structure(structureID: String?) -> Structure? {
    guard let structureID else { return nil }
    return structures.first { $0.id == structureID }
  }

نحوه استفاده از ناشران

در ادامه چند مثال اساسی از کار با ناشران در APIهای 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!")
    }
  }

پیگیری تغییرات یک ویژگی خاص در یک دستگاه

از هر ویژگی پشتیبانی شده توسط دستگاه و API های 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 که توسط APIهای 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)")
    }
  }

اشتراک در رویدادها

در APIهای Home، از رویدادها برای تشخیص تغییرات در وضعیت یک دستگاه استفاده می‌شود.

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