{"id":1042,"date":"2025-07-27T06:00:06","date_gmt":"2025-07-27T06:00:06","guid":{"rendered":"https:\/\/developers-heaven.net\/blog\/data-flow-observable-objects-observedobject-stateobject-and-environmentobject\/"},"modified":"2025-07-27T06:00:06","modified_gmt":"2025-07-27T06:00:06","slug":"data-flow-observable-objects-observedobject-stateobject-and-environmentobject","status":"publish","type":"post","link":"https:\/\/developers-heaven.net\/blog\/data-flow-observable-objects-observedobject-stateobject-and-environmentobject\/","title":{"rendered":"Data Flow &amp; Observable Objects: @ObservedObject, @StateObject, and @EnvironmentObject"},"content":{"rendered":"<h1>Data Flow &amp; Observable Objects: @ObservedObject, @StateObject, and @EnvironmentObject \ud83d\ude80<\/h1>\n<p>Crafting reactive and dynamic user interfaces in SwiftUI hinges on understanding data flow. Central to this understanding is grasping how to manage and share data effectively using <code>@ObservedObject<\/code>, <code>@StateObject<\/code>, and <code>@EnvironmentObject<\/code>. Let&#8217;s delve into these powerful property wrappers, unraveling their nuances and demonstrating how to leverage them for robust and scalable SwiftUI applications. Mastering <strong>SwiftUI Data Flow and Observable Objects<\/strong> is key to creating efficient and maintainable apps. Get ready to explore best practices and clear, concise examples.<\/p>\n<h2>Executive Summary \ud83c\udfaf<\/h2>\n<p>Data flow in SwiftUI dictates how changes in your data model reflect in your UI, and vice versa.  The <code>@ObservedObject<\/code>, <code>@StateObject<\/code>, and <code>@EnvironmentObject<\/code> property wrappers play pivotal roles in this process. <code>@ObservedObject<\/code> allows your views to observe changes in an external <code>ObservableObject<\/code>. <code>@StateObject<\/code>, introduced in iOS 14, ensures that the observed object&#8217;s lifecycle is tied to the view, preventing unintended re-initializations.  Finally, <code>@EnvironmentObject<\/code> provides a way to inject dependencies deep within your view hierarchy without prop drilling. Understanding the correct usage of each is crucial for building performant and predictable SwiftUI applications. This guide clarifies the distinctions, provides practical code examples, and offers insights into best practices, empowering you to build more sophisticated and maintainable SwiftUI apps. We will explore common pitfalls and how to avoid them ensuring your app&#8217;s data flow is smooth and reliable.<\/p>\n<h2>ObservableObject Protocol Explained \ud83d\udca1<\/h2>\n<p>The <code>ObservableObject<\/code> protocol is the cornerstone of reactive data flow in SwiftUI.  It allows your custom classes to signal when their data changes, automatically updating any views that observe them.<\/p>\n<ul>\n<li><strong>Core Functionality:<\/strong>  Enables classes to publish changes via the <code>objectWillChange<\/code> publisher.<\/li>\n<li><strong>Automatic Updates:<\/strong> SwiftUI views automatically subscribe to this publisher and redraw themselves when changes occur.<\/li>\n<li><strong>Concurrency Considerations:<\/strong> Ensure that any changes to published properties are performed on the main thread to avoid UI inconsistencies and potential crashes.  Use <code>@MainActor<\/code> for clarity.<\/li>\n<li><strong>Use Cases:<\/strong> Ideal for managing application state, representing data models, and acting as view models.<\/li>\n<li><strong>Benefits:<\/strong>  Simplifies data binding, promotes a declarative UI approach, and enhances code maintainability.<\/li>\n<\/ul>\n<h2>@ObservedObject: Observing External Data Changes \ud83d\udcc8<\/h2>\n<p><code>@ObservedObject<\/code> is your go-to property wrapper when you want a view to observe changes in an <em>existing<\/em> instance of an <code>ObservableObject<\/code>. The object is typically created or managed by a parent view.<\/p>\n<ul>\n<li><strong>Purpose:<\/strong>  Allows a view to subscribe to and react to changes in an external <code>ObservableObject<\/code> instance.<\/li>\n<li><strong>Lifecycle:<\/strong> Does *not* own the observed object&#8217;s lifecycle. The object is created and managed elsewhere.<\/li>\n<li><strong>Reinitialization:<\/strong> If the parent view recreates the observed object, the <code>@ObservedObject<\/code> will point to the new instance.<\/li>\n<li><strong>Common Use Cases:<\/strong> Passing data from a parent view to a child view, or sharing a singleton data manager across multiple views.<\/li>\n<li><strong>Potential Pitfalls:<\/strong>  Can lead to unexpected behavior if the parent view frequently reinitializes the observed object.<\/li>\n<\/ul>\n<pre><code class=\"language-swift\">\n  import SwiftUI\n\n  class UserData: ObservableObject {\n      @Published var name: String = \"John Doe\"\n  }\n\n  struct ContentView: View {\n      @ObservedObject var userData: UserData\n\n      var body: some View {\n          VStack {\n              Text(\"Name: (userData.name)\")\n              Button(\"Change Name\") {\n                  userData.name = \"Jane Doe\"\n              }\n          }\n      }\n  }\n\n  \/\/Example usage:\n  struct ParentView: View {\n      @State private var userData = UserData()\n\n      var body: some View {\n          ContentView(userData: userData)\n      }\n  }\n  <\/code><\/pre>\n<h2>@StateObject: Managing Object Lifecycle Within a View \u2705<\/h2>\n<p><code>@StateObject<\/code> (introduced in iOS 14) solves the reinitialization problem associated with <code>@ObservedObject<\/code>. It ensures that the <code>ObservableObject<\/code> instance is only created *once* during the view&#8217;s lifetime, even if the view is re-rendered.<\/p>\n<ul>\n<li><strong>Purpose:<\/strong>  Creates and manages the lifecycle of an <code>ObservableObject<\/code> instance.<\/li>\n<li><strong>Lifecycle:<\/strong> Guarantees that the object is initialized only once, even when the view redraws.<\/li>\n<li><strong>Reinitialization Prevention:<\/strong> Crucially prevents unintended reinitialization, preserving the object&#8217;s state across view updates.<\/li>\n<li><strong>Common Use Cases:<\/strong> Managing the core data model or view model for a specific view.<\/li>\n<li><strong>Benefits:<\/strong>  Eliminates unexpected state loss and ensures consistent behavior across view updates.  Provides cleaner, more predictable code.<\/li>\n<\/ul>\n<pre><code class=\"language-swift\">\n  import SwiftUI\n\n  class Counter: ObservableObject {\n      @Published var count = 0\n  }\n\n  struct MyView: View {\n      @StateObject var counter = Counter() \/\/ Only initialized once!\n\n      var body: some View {\n          VStack {\n              Text(\"Count: (counter.count)\")\n              Button(\"Increment\") {\n                  counter.count += 1\n              }\n          }\n      }\n  }\n  <\/code><\/pre>\n<h2>@EnvironmentObject: Sharing Data Across Your App \ud83c\udf10<\/h2>\n<p><code>@EnvironmentObject<\/code> provides a powerful mechanism for injecting dependencies deep within your view hierarchy without manually passing them through each intermediate view (a process known as &#8220;prop drilling&#8221;).<\/p>\n<ul>\n<li><strong>Purpose:<\/strong> Allows you to inject an <code>ObservableObject<\/code> into the environment, making it accessible to any view within that environment.<\/li>\n<li><strong>Dependency Injection:<\/strong> Simplifies the process of sharing data across complex view hierarchies.<\/li>\n<li><strong>Configuration:<\/strong> The environment object is typically injected at the root of your view hierarchy using the <code>.environmentObject()<\/code> modifier.<\/li>\n<li><strong>Common Use Cases:<\/strong> Providing access to user authentication state, application settings, or shared data managers.<\/li>\n<li><strong>Benefits:<\/strong> Reduces code clutter, improves code reusability, and simplifies dependency management.<\/li>\n<\/ul>\n<pre><code class=\"language-swift\">\n  import SwiftUI\n\n  class AppSettings: ObservableObject {\n      @Published var theme: String = \"Light\"\n  }\n\n  struct ThemeView: View {\n      @EnvironmentObject var settings: AppSettings\n\n      var body: some View {\n          Text(\"Current Theme: (settings.theme)\")\n      }\n  }\n\n  struct ContentView: View {\n      var body: some View {\n          ThemeView()\n      }\n  }\n\n  @main\n  struct MyApp: App {\n      @StateObject var settings = AppSettings()\n\n      var body: some Scene {\n          WindowGroup {\n              ContentView()\n                  .environmentObject(settings) \/\/ Inject into the environment\n          }\n      }\n  }\n  <\/code><\/pre>\n<h2>Practical Example: A Simple Task Manager \ud83d\udcdd<\/h2>\n<p>Let&#8217;s combine these concepts to build a simplified task manager.  This example will demonstrate how <code>@ObservedObject<\/code>, <code>@StateObject<\/code>, and <code>@EnvironmentObject<\/code> can work together in a real-world application.<\/p>\n<pre><code class=\"language-swift\">\n  import SwiftUI\n\n  \/\/ 1. Task Model\n  struct Task: Identifiable {\n      let id = UUID()\n      var title: String\n      var isCompleted: Bool = false\n  }\n\n  \/\/ 2. Task Manager (ObservableObject)\n  class TaskManager: ObservableObject {\n      @Published var tasks: [Task] = []\n\n      func addTask(title: String) {\n          tasks.append(Task(title: title))\n      }\n\n      func toggleCompletion(task: Task) {\n          if let index = tasks.firstIndex(where: { $0.id == task.id }) {\n              tasks[index].isCompleted.toggle()\n          }\n      }\n  }\n\n  \/\/ 3. Environment Object (AppSettings - for demonstration)\n  class AppSettings: ObservableObject {\n      @Published var showCompletedTasks: Bool = true\n  }\n\n  \/\/ 4. Task List View (Uses ObservedObject)\n  struct TaskListView: View {\n      @ObservedObject var taskManager: TaskManager\n\n      var body: some View {\n          List {\n              ForEach(taskManager.tasks) { task in\n                  TaskRow(task: task, taskManager: taskManager)\n              }\n          }\n      }\n  }\n\n  \/\/ 5. Task Row View\n  struct TaskRow: View {\n      let task: Task\n      @ObservedObject var taskManager: TaskManager \/\/ Using ObservedObject to access the taskManager in a child view.\n\n      var body: some View {\n          HStack {\n              Text(task.title)\n              Spacer()\n              Button(action: {\n                  taskManager.toggleCompletion(task: task)\n              }) {\n                  Image(systemName: task.isCompleted ? \"checkmark.circle.fill\" : \"circle\")\n              }\n          }\n      }\n  }\n\n  \/\/ 6. Add Task View\n  struct AddTaskView: View {\n      @Environment(.dismiss) var dismiss \/\/allows to dissmiss this view\n      @State private var taskTitle: String = \"\"\n      @ObservedObject var taskManager: TaskManager\n\n      var body: some View {\n          VStack {\n              TextField(\"Task Title\", text: $taskTitle)\n                  .padding()\n              Button(\"Add Task\") {\n                  taskManager.addTask(title: taskTitle)\n                  dismiss()\n              }\n              .padding()\n          }\n      }\n  }\n\n  \/\/ 7. Main Content View (Uses StateObject)\n  struct ContentView: View {\n      @StateObject var taskManager = TaskManager()\n      @State private var showingAddTask = false\n\n      var body: some View {\n          NavigationView {\n              TaskListView(taskManager: taskManager)\n                  .navigationTitle(\"Task Manager\")\n                  .toolbar {\n                      ToolbarItem(placement: .navigationBarTrailing) {\n                          Button {\n                              showingAddTask.toggle()\n                          } label: {\n                              Label(\"Add Task\", systemImage: \"plus\")\n                          }\n                      }\n                  }\n                  .sheet(isPresented: $showingAddTask) {\n                      AddTaskView(taskManager: taskManager)\n                  }\n          }\n      }\n  }\n\n  \/\/ 8. Application Entry Point\n  @main\n  struct TaskManagerApp: App {\n      @StateObject var appSettings = AppSettings() \/\/Not using it here, but can be injected to ContentView using .environmentObject() if needed.\n\n      var body: some Scene {\n          WindowGroup {\n              ContentView()\n              \/\/.environmentObject(appSettings)\n          }\n      }\n  }\n  <\/code><\/pre>\n<h2>FAQ \u2753<\/h2>\n<ul>\n<li>\n      <strong>Q: When should I use <code>@ObservedObject<\/code> vs. <code>@StateObject<\/code>?<\/strong><br \/>\n      A: Use <code>@ObservedObject<\/code> when the observed object is created and managed *outside* the current view.  Use <code>@StateObject<\/code> when the view *owns* and manages the lifecycle of the observed object, preventing reinitialization upon view redraws. Think of <code>@StateObject<\/code> as a persistent state container for your view.\n    <\/li>\n<li>\n      <strong>Q: What happens if I forget to inject an <code>@EnvironmentObject<\/code>?<\/strong><br \/>\n      A: Your app will crash with a runtime error.  SwiftUI expects the environment object to be present. Always ensure you inject the object using <code>.environmentObject()<\/code> at an ancestor view. It is good practice to add precondition checks at the start of Views consuming <code>@EnvironmentObject<\/code> in order to fail early.\n    <\/li>\n<li>\n      <strong>Q: Can I use multiple <code>@EnvironmentObject<\/code> instances?<\/strong><br \/>\n      A: Yes! You can inject multiple environment objects. Each environment object is identified by its type.  Views can then access the specific environment object they need based on that type.\n    <\/li>\n<\/ul>\n<h2>Conclusion \u2728<\/h2>\n<p>Mastering <strong>SwiftUI Data Flow and Observable Objects<\/strong>, specifically <code>@ObservedObject<\/code>, <code>@StateObject<\/code>, and <code>@EnvironmentObject<\/code>, is essential for building robust and maintainable SwiftUI applications. By understanding the nuances of each property wrapper, you can effectively manage data flow, prevent unexpected behavior, and create a more streamlined and efficient development workflow. Remember to consider the lifecycle of your data and choose the appropriate property wrapper accordingly.  Embrace these tools, and you&#8217;ll be well on your way to building sophisticated and reactive user interfaces. Don&#8217;t forget to leverage Apple&#8217;s official documentation for the latest updates and recommendations.<\/p>\n<h3>Tags<\/h3>\n<p>  SwiftUI, Data Flow, ObservableObject, StateObject, EnvironmentObject<\/p>\n<h3>Meta Description<\/h3>\n<p>  Master SwiftUI data flow! Learn about @ObservedObject, @StateObject, and @EnvironmentObject for efficient and reactive app development.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Data Flow &amp; Observable Objects: @ObservedObject, @StateObject, and @EnvironmentObject \ud83d\ude80 Crafting reactive and dynamic user interfaces in SwiftUI hinges on understanding data flow. Central to this understanding is grasping how to manage and share data effectively using @ObservedObject, @StateObject, and @EnvironmentObject. Let&#8217;s delve into these powerful property wrappers, unraveling their nuances and demonstrating how to [&hellip;]<\/p>\n","protected":false},"author":0,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4211],"tags":[4274,4285,4282,4284,137,4033,1456,4283,4225,4279],"class_list":["post-1042","post","type-post","status-publish","format-standard","hentry","category-ios-development","tag-observableobject","tag-app-architecture","tag-data-flow","tag-environmentobject","tag-ios-development","tag-reactive-programming","tag-state-management","tag-stateobject","tag-swiftui","tag-swiftui-tutorial"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.0 (Yoast SEO v25.0) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Data Flow &amp; Observable Objects: @ObservedObject, @StateObject, and @EnvironmentObject - Developers Heaven<\/title>\n<meta name=\"description\" content=\"Master SwiftUI data flow! Learn about @ObservedObject, @StateObject, and @EnvironmentObject for efficient and reactive app development.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/developers-heaven.net\/blog\/data-flow-observable-objects-observedobject-stateobject-and-environmentobject\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Data Flow &amp; Observable Objects: @ObservedObject, @StateObject, and @EnvironmentObject\" \/>\n<meta property=\"og:description\" content=\"Master SwiftUI data flow! Learn about @ObservedObject, @StateObject, and @EnvironmentObject for efficient and reactive app development.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/developers-heaven.net\/blog\/data-flow-observable-objects-observedobject-stateobject-and-environmentobject\/\" \/>\n<meta property=\"og:site_name\" content=\"Developers Heaven\" \/>\n<meta property=\"article:published_time\" content=\"2025-07-27T06:00:06+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/via.placeholder.com\/600x400?text=Data+Flow++Observable+Objects+ObservedObject+StateObject+and+EnvironmentObject\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/developers-heaven.net\/blog\/data-flow-observable-objects-observedobject-stateobject-and-environmentobject\/\",\"url\":\"https:\/\/developers-heaven.net\/blog\/data-flow-observable-objects-observedobject-stateobject-and-environmentobject\/\",\"name\":\"Data Flow &amp; Observable Objects: @ObservedObject, @StateObject, and @EnvironmentObject - Developers Heaven\",\"isPartOf\":{\"@id\":\"https:\/\/developers-heaven.net\/blog\/#website\"},\"datePublished\":\"2025-07-27T06:00:06+00:00\",\"author\":{\"@id\":\"\"},\"description\":\"Master SwiftUI data flow! Learn about @ObservedObject, @StateObject, and @EnvironmentObject for efficient and reactive app development.\",\"breadcrumb\":{\"@id\":\"https:\/\/developers-heaven.net\/blog\/data-flow-observable-objects-observedobject-stateobject-and-environmentobject\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/developers-heaven.net\/blog\/data-flow-observable-objects-observedobject-stateobject-and-environmentobject\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/developers-heaven.net\/blog\/data-flow-observable-objects-observedobject-stateobject-and-environmentobject\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/developers-heaven.net\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Data Flow &amp; Observable Objects: @ObservedObject, @StateObject, and @EnvironmentObject\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/developers-heaven.net\/blog\/#website\",\"url\":\"https:\/\/developers-heaven.net\/blog\/\",\"name\":\"Developers Heaven\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/developers-heaven.net\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Data Flow &amp; Observable Objects: @ObservedObject, @StateObject, and @EnvironmentObject - Developers Heaven","description":"Master SwiftUI data flow! Learn about @ObservedObject, @StateObject, and @EnvironmentObject for efficient and reactive app development.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/developers-heaven.net\/blog\/data-flow-observable-objects-observedobject-stateobject-and-environmentobject\/","og_locale":"en_US","og_type":"article","og_title":"Data Flow &amp; Observable Objects: @ObservedObject, @StateObject, and @EnvironmentObject","og_description":"Master SwiftUI data flow! Learn about @ObservedObject, @StateObject, and @EnvironmentObject for efficient and reactive app development.","og_url":"https:\/\/developers-heaven.net\/blog\/data-flow-observable-objects-observedobject-stateobject-and-environmentobject\/","og_site_name":"Developers Heaven","article_published_time":"2025-07-27T06:00:06+00:00","og_image":[{"url":"https:\/\/via.placeholder.com\/600x400?text=Data+Flow++Observable+Objects+ObservedObject+StateObject+and+EnvironmentObject","type":"","width":"","height":""}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/developers-heaven.net\/blog\/data-flow-observable-objects-observedobject-stateobject-and-environmentobject\/","url":"https:\/\/developers-heaven.net\/blog\/data-flow-observable-objects-observedobject-stateobject-and-environmentobject\/","name":"Data Flow &amp; Observable Objects: @ObservedObject, @StateObject, and @EnvironmentObject - Developers Heaven","isPartOf":{"@id":"https:\/\/developers-heaven.net\/blog\/#website"},"datePublished":"2025-07-27T06:00:06+00:00","author":{"@id":""},"description":"Master SwiftUI data flow! Learn about @ObservedObject, @StateObject, and @EnvironmentObject for efficient and reactive app development.","breadcrumb":{"@id":"https:\/\/developers-heaven.net\/blog\/data-flow-observable-objects-observedobject-stateobject-and-environmentobject\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/developers-heaven.net\/blog\/data-flow-observable-objects-observedobject-stateobject-and-environmentobject\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/developers-heaven.net\/blog\/data-flow-observable-objects-observedobject-stateobject-and-environmentobject\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/developers-heaven.net\/blog\/"},{"@type":"ListItem","position":2,"name":"Data Flow &amp; Observable Objects: @ObservedObject, @StateObject, and @EnvironmentObject"}]},{"@type":"WebSite","@id":"https:\/\/developers-heaven.net\/blog\/#website","url":"https:\/\/developers-heaven.net\/blog\/","name":"Developers Heaven","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/developers-heaven.net\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"}]}},"_links":{"self":[{"href":"https:\/\/developers-heaven.net\/blog\/wp-json\/wp\/v2\/posts\/1042","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/developers-heaven.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/developers-heaven.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"replies":[{"embeddable":true,"href":"https:\/\/developers-heaven.net\/blog\/wp-json\/wp\/v2\/comments?post=1042"}],"version-history":[{"count":0,"href":"https:\/\/developers-heaven.net\/blog\/wp-json\/wp\/v2\/posts\/1042\/revisions"}],"wp:attachment":[{"href":"https:\/\/developers-heaven.net\/blog\/wp-json\/wp\/v2\/media?parent=1042"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/developers-heaven.net\/blog\/wp-json\/wp\/v2\/categories?post=1042"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/developers-heaven.net\/blog\/wp-json\/wp\/v2\/tags?post=1042"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}