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

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

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

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

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

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

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

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

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

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

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