ตรวจสอบสถานะอุปกรณ์ใน iOS

ใน Home API สําหรับ iOS คุณสามารถสังเกตการเปลี่ยนแปลงสถานะในบ้านได้โดยใช้เฟรมเวิร์ก Combine ใน Swift คุณสามารถสังเกตการเปลี่ยนแปลงโครงสร้าง ห้อง เมตาดาต้าของอุปกรณ์ และสถานะของอุปกรณ์ใน Home API โดยใช้ API ใดก็ได้โดยใช้ HomeDevice ซึ่งทําได้โดยการติดตามผู้เผยแพร่โฆษณาที่แสดงค่าจากเหตุการณ์แบบไม่พร้อมกัน

เมื่อมีการเพิ่ม ลบ หรือแก้ไขรายการใดก็ตามในคอลเล็กชัน ระบบจะแสดงภาพรวมล่าสุดของคอลเล็กชัน

นักพัฒนาแอปจะเป็นผู้พิจารณาการเปลี่ยนแปลงที่เฉพาะเจาะจงโดยเปรียบเทียบภาพรวมนี้กับสำเนาเก่า คุณสามารถใช้ช่อง id ที่ระบุไว้สำหรับออบเจ็กต์หลักแต่ละประเภทใน Home API เพื่อวัตถุประสงค์นี้

วิธีเลิกแพ็กออบเจ็กต์ที่ไม่บังคับ

เมื่อออบเจ็กต์เป็นออปชัน ให้ใช้ if let หรือ guard เพื่อเลิกแพ็กออบเจ็กต์อย่างปลอดภัย อย่าใช้ ! เนื่องจากไม่ควรใช้ ! เว้นแต่นักพัฒนาแอปจะทราบอย่างแน่ชัดว่าออบเจ็กต์ต้องไม่มีค่าเป็น Null

พารามิเตอร์อินพุต 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!")
    }
  }

ติดตามการเปลี่ยนแปลงลักษณะเฉพาะในอุปกรณ์

ใช้แอตทริบิวต์ที่อุปกรณ์และ Home API รองรับ ดูรายการทั้งหมดได้ที่ 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 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() query

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
    Logger.error("Error getting FanDeviceType: \(error)")
    return Empty<FanDeviceType, Never>().eraseToAnyPublisher()
  }
  .sink { [weak self] fanDeviceType in
    self?.fanDeviceType = fanDeviceType
    self?.updateTileInfo()
  }
}