iOS-এর হোম এপিআই-গুলোতে, সুইফটের কম্বাইন ফ্রেমওয়ার্ক ব্যবহারের মাধ্যমে হোমের স্টেটের পরিবর্তন পর্যবেক্ষণ করা সম্ভব হয়। হোমডিভাইস ব্যবহার করে যেকোনো এপিআই-এর মাধ্যমে HomeDevice এপিআই-গুলোতে স্ট্রাকচার, রুম, ডিভাইস মেটাডেটা এবং ডিভাইস স্টেটের পরিবর্তন পর্যবেক্ষণ করা যায়। অ্যাসিঙ্ক্রোনাস ইভেন্ট থেকে ভ্যালু প্রকাশকারী পাবলিশারগুলোতে সাবস্ক্রাইব করার মাধ্যমে এটি করা হয়।
যখন কোনো কালেকশনের কোনো আইটেম যোগ, মুছে ফেলা বা পরিবর্তন করা হয়, তখন কালেকশনটির সর্বশেষ স্ন্যাপশটটি ফেরত দেওয়া হয়।
এই স্ন্যাপশটটিকে একটি পুরোনো কপির সাথে তুলনা করে নির্দিষ্ট পরিবর্তনগুলো বের করার দায়িত্ব ডেভেলপারের। এই উদ্দেশ্যে হোম এপিআই-তে প্রতিটি প্যারেন্ট অবজেক্ট টাইপের জন্য প্রদত্ত id ফিল্ডটি ব্যবহার করা যেতে পারে।
ঐচ্ছিক অবজেক্টগুলি কীভাবে আনর্যাপ করবেন
যখন কোনো অবজেক্ট ঐচ্ছিক হয়, তখন অবজেক্টটিকে নিরাপদে আনর্যাপ করতে if let বা guard ব্যবহার করুন। ! ব্যবহার করবেন না ! কারণ ডেভেলপার যদি নিশ্চিতভাবে না জানেন যে অবজেক্টটি nil হতে পারে না, তবেই কেবল ! ব্যবহার করা উচিত।
উদাহরণটিতে ইনপুট প্যারামিটার structureID String? হিসেবে সংজ্ঞায়িত করা হয়েছে, যার অর্থ এটি একটি ঐচ্ছিক স্ট্রিং যা nil হওয়ার সম্ভাবনা রাখে। এই ফাংশনটি structureID তে দেওয়া ইনপুটের উপর ভিত্তি করে Structure অবজেক্টটি খুঁজে বের করে।
ঐচ্ছিক অবজেক্টগুলো পরিচালনা করার জন্য আমাদের পরামর্শ নিচে দেওয়া হলো:
func structure(structureID: String?) -> Structure? {
guard let structureID else { return nil }
return structures.first { $0.id == structureID }
}
প্রকাশকদের কীভাবে ব্যবহার করবেন
নিচে হোম এপিআই-তে পাবলিশারদের সাথে কাজ করার কিছু প্রাথমিক উদাহরণ দেওয়া হলো। নিম্নলিখিত উদাহরণগুলোর জন্য, 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!")
}
}
ডিভাইসে একটি নির্দিষ্ট বৈশিষ্ট্যের পরিবর্তনগুলি ট্র্যাক করুন
ডিভাইস এবং হোম এপিআই দ্বারা সমর্থিত যেকোনো ট্রেইট ব্যবহার করুন। সম্পূর্ণ তালিকার জন্য, 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 ডিভাইস টাইপ ব্যবহার করুন। সম্পূর্ণ তালিকার জন্য, 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)")
}
}
ইভেন্টগুলিতে সাবস্ক্রাইব করুন
হোম এপিআই-গুলোতে কোনো ডিভাইসের অবস্থার পরিবর্তন শনাক্ত করতে ইভেন্ট ব্যবহার করা হয়।
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()
}
}