مراقبة حالة الجهاز على أجهزة iOS

في واجهات برمجة التطبيقات لمنزل Google على iOS، يمكن رصد التغييرات التي تطرأ على الحالة في المنزل من خلال استخدام إطار عمل Combine في Swift. يمكن رصد التغييرات في الهياكل والغرف وبيانات الجهاز الوصفية و حالة الجهاز في واجهات برمجة التطبيقات لمنزل Google باستخدام أي واجهة برمجة تطبيقات تستخدم HomeDevice. يتم ذلك من خلال الاشتراك في الناشرين الذين يعرضون قيمًا من الأحداث غير المتزامنة.

عند إضافة أي عنصر في مجموعة أو حذفه أو تعديله، يتم عرض أحدث لقطة من المجموعة.

على المطوّر استنتاج التغييرات المحدّدة من خلال مقارنة هذه اللقطة بنسخة أقدم. يمكن استخدام حقل id المقدَّم لكل نوع من أنواع الكائنات الرئيسية في واجهات برمجة التطبيقات لمنزل Google لهذا الغرض.

كيفية إزالة التغليف عن الكائنات الاختيارية

عندما يكون الكائن اختياريًا، استخدِم if let أو guard لإزالة التغليف عن الكائن بأمان. لا تستخدِم ! لأنّه لا يجب استخدامها مطلقًا إلا إذا كان المطوّر يعرف على وجه اليقين أنّ الكائن لا يمكن أن يكون فارغًا.!

تم تعريف مَعلمة الإدخال structureID في المثال على أنّها String?، ما يعني أنّها سلسلة اختيارية ويمكن أن تكون فارغة. تعثر هذه الدالة على كائن Structure استنادًا إلى الإدخال في structureID.

في ما يلي الطريقة المقترَحة للتعامل مع الكائنات الاختيارية:

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

كيفية استخدام الناشرين

في ما يلي بعض الأمثلة الأساسية على استخدام الناشرين في واجهات برمجة التطبيقات لمنزل Google. بالنسبة إلى الأمثلة التالية، يجب إنشاء مثيل من 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!")
    }
  }

تتبُّع التغييرات في سمة محدّدة على جهاز

استخدِم أي سمة متوافقة مع الجهاز وواجهات برمجة التطبيقات لمنزل Google. للاطّلاع على القائمة الكاملة، يُرجى الاطّلاع على 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 متوافق مع واجهات برمجة التطبيقات لمنزل Google. للاطّلاع على القائمة الكاملة، يُرجى الاطّلاع على 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)")
    }
  }

الاشتراك في الأحداث

في واجهات برمجة التطبيقات لمنزل Google، تُستخدَم الأحداث لرصد التغييرات في حالة الجهاز.

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