@ObservedObject হল SwiftUI-এর একটি Property Wrapper যা বাইরে থেকে পাঠানো ObservableObject ইনস্ট্যান্স পর্যবেক্ষণের জন্য ব্যবহৃত হয়। @StateObject-এর বিপরীতে, @ObservedObject কোনো অবজেক্ট তৈরি করে না — এটি ইতিমধ্যে বিদ্যমান অবজেক্টের পরিবর্তনে সাবস্ক্রাইব করে। Apple Developer Documentation (2025) অনুসারে, @ObservedObject চাইল্ড ভিউ-এ ব্যবহৃত হয় যেগুলোকে প্যারেন্টের ডেটা ট্র্যাক করতে হয়। @ObservedObject অবজেক্টের লাইফসাইকেল পরিচালনা না করেই রিঅ্যাকটিভ সংযোগ প্রদান করে।
মূল পয়েন্ট
@ObservedObject হল একটি Property Wrapper যা একটি ভিউকে ObservableObject-এর পরিবর্তনে সাবস্ক্রাইব করে। ObservableObject হল Combine ফ্রেমওয়ার্কের একটি প্রোটোকল যার জন্য objectWillChange publisher বাস্তবায়ন প্রয়োজন। যখন @Published দিয়ে চিহ্নিত কোনো বৈশিষ্ট্য ObservedObject-এর ভিতরে পরিবর্তিত হয়, publisher একটি সিগন্যাল পাঠায় এবং SwiftUI @ObservedObject-এর মাধ্যমে সাবস্ক্রাইবকৃত সমস্ত ভিউ পুনরায় রেন্ডার করে।
@ObservedObject-এর প্রধান বৈশিষ্ট্য হল মালিকানার অভাব। ভিউ অবজেক্ট তৈরি বা ধ্বংস করার জন্য দায়ী নয়। অবজেক্ট প্যারেন্ট ভিউতে (@StateObject-এর মাধ্যমে) তৈরি হয় বা @EnvironmentObject-এর মাধ্যমে ইনজেক্ট করা হয়। চাইল্ড ভিউ শুধু পরিবর্তন পর্যবেক্ষণ করে এবং আপডেট গ্রহণ করে। যদি প্যারেন্টে অবজেক্ট প্রতিস্থাপিত হয়, @ObservedObject নতুন ইনস্ট্যান্সে সুইচ করে।
@ObservedObject ডেটা ভাগ করে নেওয়ার পরিস্থিতিতে উপযুক্ত: ব্যবহারকারী মডেল, সাধারণ সেটিংস, সার্ভার সংযোগের অবস্থা। যখন বিভিন্ন স্তরের একাধিক ভিউকে একই ডেটা প্রদর্শন করতে হয়, @ObservedObject প্রতিটি ভিউতে একটি উৎসের জন্য স্বাধীন কিন্তু সামঞ্জস্যপূর্ণ সাবস্ক্রিপশন তৈরি করে।
@ObservedObject এবং @StateObject-এর মধ্যে পার্থক্য SwiftUI ইন্টারভিউতে সবচেয়ে সাধারণ প্রশ্নগুলোর একটি। মূল নিয়ম: @StateObject অবজেক্ট তৈরি করে এবং এর মালিক হয়, @ObservedObject ইতিমধ্যে বিদ্যমান অবজেক্ট পর্যবেক্ষণ করে। এই নিয়ম লঙ্ঘন করলে অপ্রত্যাশিত ডেটা হারানো বা দ্বৈত আরম্ভকরণ হয়।
| বৈশিষ্ট্য | @StateObject | @ObservedObject |
|---|---|---|
| অবজেক্ট তৈরি | হ্যাঁ, ভিউ আরম্ভকরণে | না, প্রস্তুত গ্রহণ করে |
| মালিকানা | বর্তমান ভিউ | প্যারেন্ট উপাদান |
| একক ইনস্ট্যান্স | হ্যাঁ, পুরো লাইফসাইকেলের জন্য | না, প্রতিস্থাপিত হতে পারে |
| রেন্ডারে পুনর্নির্মাণ | না, সংরক্ষিত থাকে | প্যারেন্টের উপর নির্ভর করে |
| কোথায় ব্যবহার করবেন | রুট ভিউ মালিক | চাইল্ড ভিউ |
@StateObject নিশ্চিত করে যে অবজেক্ট একবার তৈরি হয় এবং ভিউ কাঠামোর বারবার আরম্ভকরণ থেকে টিকে থাকে। @ObservedObject বাইরে থেকে অবজেক্ট গ্রহণ করে এবং প্রতিটি প্যারেন্ট কাঠামো আরম্ভকরণের সাথে পুনরায় তৈরি হয়। যদি প্যারেন্ট অবজেক্টের জন্য @StateObject ব্যবহার করে, চাইল্ড ভিউ নিরাপদে @ObservedObject প্রয়োগ করতে পারে — অবজেক্টটি সম্পূর্ণ শ্রেণীবিন্যাসে অনন্য হবে।
@ObservedObject-এর ট্র্যাকিং প্রক্রিয়া Combine এবং ObservableObject প্রোটোকলের উপর ভিত্তি করে। আরম্ভকরণের সময়, SwiftUI objectWillChange publisher কল করে — অবজেক্টকে একটি @Published বৈশিষ্ট্য পরিবর্তনের আগে সিগন্যাল নির্গত করতে হয়। Combine সিগন্যালটি SwiftUI ডিপেন্ডেন্সি গ্রাফে পাঠায়, যা সমস্ত নির্ভরশীল ভিউকে আপডেট প্রয়োজন হিসাবে চিহ্নিত করে। এটি মান পরিবর্তনের আগে সুসংগতভাবে ঘটে।
class WeatherService: ObservableObject {
@Published var temperature: Double = 22.0
@Published var city: String = "Moscow"
}
struct WeatherView: View {
@ObservedObject var weather: WeatherService
var body: some View {
VStack {
Text("\(weather.city)")
Text("\(weather.temperature)°C")
}
}
}
লিস্টিংয়ে WeatherService দুটি @Published বৈশিষ্ট্য সহ একটি ObservableObject। WeatherView @ObservedObject var weather: WeatherService ঘোষণা করে, প্যারেন্ট থেকে ইনস্ট্যান্স গ্রহণ করে। যখন temperature পরিবর্তিত হয়, objectWillChange নতুন মান সেট করার আগে ফায়ার হয়, SwiftUI WeatherView পুনরায় রেন্ডার করে এবং প্রকৃত তাপমাত্রা প্রদর্শিত হয়। সাবস্ক্রিপশন স্বয়ংক্রিয়ভাবে SwiftUI দ্বারা পরিচালিত হয় — ডেভেলপারকে sink বা dispose কল করার প্রয়োজন নেই।
প্রথম প্যাটার্ন হল আরম্ভকের মাধ্যমে মডেল পাঠানো। প্যারেন্ট @StateObject-এর মাধ্যমে ObservableObject তৈরি করে এবং এটি চাইল্ড ভিউ-এ @ObservedObject হিসেবে পাঠায়। এটি একটি মানক শ্রেণীবিন্যাসগত ডেটা স্থানান্তর যেখানে রুট ভিউ মডেলের লাইফসাইকেল পরিচালনা করে এবং সমস্ত নেস্টেড উপাদান পরিবর্তনে সাবস্ক্রাইব করে।
দ্বিতীয় প্যাটার্ন হল EnvironmentObject, SwiftUI Environment-এর মাধ্যমে @ObservedObject-এর একটি বৈশ্বিক সংস্করণ। অবজেক্টটি সিন বা রুট ভিউ স্তরে ইনজেক্ট করা হয় এবং আরম্ভকরের মাধ্যমে স্পষ্ট পাঠানো ছাড়াই সমস্ত চাইল্ড উপাদানের জন্য স্বয়ংক্রিয়ভাবে উপলব্ধ হয়। চাইল্ড ভিউ-এর ভিতরে, @EnvironmentObject @ObservedObject-এর মতোই কাজ করে কিন্তু পরিবেশ থেকে অবজেক্ট গ্রহণ করে।
তৃতীয় প্যাটার্ন হল একাধিক ObservableObject-এর কম্পোজিশন। জটিল অ্যাপ্লিকেশনে, একটি ভিউ একাধিক অবজেক্ট পর্যবেক্ষণ করতে পারে: @ObservedObject var user: UserService, @ObservedObject var network: NetworkMonitor। এটি পরিষেবাগুলির মধ্যে দায়িত্ব পৃথক করে এবং প্রতিটি উপাদানের পরীক্ষাযোগ্যতা বজায় রাখে।
struct DashboardView: View {
@ObservedObject var user: UserViewModel
@ObservedObject var network: NetworkMonitor
var body: some View {
VStack {
Text("Welcome, \(user.name)")
HStack {
Circle()
.fill(network.isConnected ? Color.green : Color.red)
.frame(width: 10, height: 10)
}
}
}
}
DashboardView UserViewModel এবং NetworkMonitor পর্যবেক্ষণ করে। প্রতিটি অবজেক্ট তার নিজস্ব ডেটা ডোমেন পরিচালনা করে এবং স্বাধীনভাবে ভিউ-কে পরিবর্তন সম্পর্কে জানায়। যদি নেটওয়ার্ক সংযোগ বিচ্ছিন্ন হয়, NetworkMonitor isConnected পরিবর্তন করে এবং SwiftUI DashboardView পুনরায় রেন্ডার করে, নির্দেশকের রঙ আপডেট করে। ObservableObject-এর কম্পোজিশন SwiftUI অ্যাপ্লিকেশনে ডেটা সংগঠিত করার পছন্দের উপায়।
@Published হল Combine-এর একটি Property Wrapper যা ObservableObject-এর ভিতরের একটি বৈশিষ্ট্যে স্বয়ংক্রিয়ভাবে publisher যোগ করে। যখন একটি @Published বৈশিষ্ট্য পরিবর্তিত হয়, Combine objectWillChange publisher-এর মাধ্যমে একটি ইভেন্ট তৈরি করে। @ObservedObject বা @StateObject ব্যবহার করার সময় SwiftUI এই publisher-এ সাবস্ক্রাইব করে এবং প্রতিটি নতুন মানে ভিউ পুনরায় রেন্ডার করে।
@Published সব ধরনের বৈশিষ্ট্য সমর্থন করে, যার মধ্যে অপশনাল, কালেকশন এবং কাস্টম স্ট্রাকচার অন্তর্ভুক্ত। তবে, কালেকশনের (অ্যারে, ডিকশনারি) জন্য, SwiftUI শুধু রেফারেন্স প্রতিস্থাপন ট্র্যাক করে, বিষয়বস্তু পরিবর্তন নয়। উপাদান যোগ বা অপসারণ সনাক্ত করতে, আপনাকে সম্পূর্ণ কালেকশন পুনরায় নির্ধারণ করতে হবে অথবা ম্যানুয়াল objectWillChange.send() সহ ObservableObject ব্যবহার করতে হবে।
একটি গুরুত্বপূর্ণ বিবরণ: @Published শুধুমাত্র ObservableObject বাস্তবায়নকারী ক্লাসের ভিতরে ব্যবহার করতে হবে। ObservableObject-এর বাইরে @Published ব্যবহার করলে কম্পাইলেশন ত্রুটি হবে। এছাড়াও, @Published অলস আরম্ভকরণ বৈশিষ্ট্যে (lazy var) বা গণনাকৃত বৈশিষ্ট্যে প্রয়োগ করা যায় না।
সবচেয়ে গুরুতর ভুল হল অবজেক্ট তৈরি করতে @ObservedObject ব্যবহার করা। যদি আপনি প্যারেন্ট ভিউতে @ObservedObject var model = UserViewModel() লেখেন, প্রতিটি রেন্ডার একটি নতুন UserViewModel ইনস্ট্যান্স তৈরি করবে। ডেটা হারিয়ে যাবে এবং @Published সাবস্ক্রিপশন পুনরায় তৈরি হবে। তৈরির জন্য সর্বদা @StateObject এবং শুধুমাত্র প্রস্তুত অবজেক্ট গ্রহণের জন্য @ObservedObject ব্যবহার করুন।
দ্বিতীয় ভুল হল @Published বৈশিষ্ট্য মূল থ্রেডের বাইরে পরিবর্তন করা। ObservableObject Combine ব্যবহার করে যার জন্য মূল থ্রেডে (main actor) পরিবর্তন পাঠানো প্রয়োজন। যদি আপনি ব্যাকগ্রাউন্ড কিউতে @Published পরিবর্তন করেন, SwiftUI অনুপযুক্ত সময়ে ভিউ পুনরায় রেন্ডার করতে পারে, যার ফলে রেস কন্ডিশন হয়। আপডেটের জন্য DispatchQueue.main.async বা @MainActor ব্যবহার করুন।
তৃতীয় সমস্যা হল চক্রীয় আপডেট। যদি একটি @Published পরিবর্তন পার্শ্বপ্রতিক্রিয়া সৃষ্টি করে যা আবার @Published পরিবর্তন করে, একটি অসীম পুনরায় রেন্ডার লুপ হয়। সমাধান: গার্ড ফ্ল্যাগ (isUpdating) ব্যবহার করুন অথবা স্পষ্ট দায়িত্ব সীমা সহ বিভিন্ন ObservableObject-এ লজিক আলাদা করুন।
সচরাচর জিজ্ঞাসিত প্রশ্ন
হ্যাঁ, SwiftUI @ObservedObject var model: UserViewModel? সমর্থন করে। তবে, অবজেক্ট nil থাকাকালীন ভিউ পরিবর্তনে সাবস্ক্রাইব করবে না। যখন মান নির্ধারণ করা হয়, সাবস্ক্রিপশন স্বয়ংক্রিয়ভাবে সক্রিয় হয়।
@ObservedObject আরম্ভকের মাধ্যমে অবজেক্ট গ্রহণ করে, @EnvironmentObject SwiftUI Environment-এর মাধ্যমে। @EnvironmentObject-এর কনস্ট্রাক্টরের মাধ্যমে স্পষ্ট পাঠানোর প্রয়োজন নেই, তবে অবজেক্টটি শ্রেণীবিন্যাসের শীর্ষ স্তরে ইনজেক্ট করতে হবে।
বৈশিষ্ট্য পরিবর্তনের আগে objectWillChange.send() কল করুন। এটি উপকারী যখন @Published উপযুক্ত নয় (উদাহরণস্বরূপ, গণনাকৃত বৈশিষ্ট্য বা কালেকশন অপারেশনের জন্য যেখানে পরিবর্তনের আগে রিপোর্ট করতে হয়)।
@ObservedObject এবং @Published রেফারেন্স প্রতিস্থাপন ট্র্যাক করে, কালেকশনের বিষয়বস্তু পরিবর্তন নয়। পুনরায় রেন্ডার ট্রিগার করতে, আপনাকে অ্যারে পুনরায় নির্ধারণ করতে হবে: items.append(newItem) → items = items অথবা পরিবর্তনের আগে objectWillChange.send() ব্যবহার করুন।
না, @ObservedObject হল একটি SwiftUI Property Wrapper যা শুধুমাত্র View প্রোটোকল বাস্তবায়নকারী প্রকারের ভিতরে উপলব্ধ। সাধারণ স্ট্রাকচারের জন্য, ObservableObjectPublisher-এর সাথে সরাসরি Combine ব্যবহার করুন।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন