Publishing changes from background threads is not allowed; make sure to publish values from the main thread (via operators like receive(on:)) on model updates.

When working with background threads in an application, it is important to follow certain guidelines regarding the publishing of changes. One such guideline states that publishing values should be done from the main thread, using operators like “receive(on:)”, on model updates.

Let’s consider an example to understand this concept better. Suppose we have a model class called “UserModel” that holds information about a user. We also have a background thread that fetches updated user details from a server.

In this scenario, we should avoid directly updating the UserModel instance from the background thread. Instead, we should utilize the “receive(on:)” operator to publish the updated values from the main thread. Here’s an example:


class UserModel {
  @Published var name: String = ""
  @Published var age: Int = 0
}

let userModel = UserModel()

DispatchQueue.global().async {
  // Simulating a network call or background task
  let updatedName = "John Doe"
  let updatedAge = 25

  DispatchQueue.main.async {
    // Publishing the updates on the main thread
    userModel.name = updatedName
    userModel.age = updatedAge
  }
}

// Subscribing to receive updates on the main thread
let cancellation = userModel.$name.receive(on: DispatchQueue.main).sink { updatedName in
  print("Updated name:", updatedName)
}

// Output:
// Updated name: John Doe

In the above example, the background thread fetches the updated values for the user’s name and age. However, instead of directly updating the userModel instance from the background thread, we switch to the main thread using the “receive(on:)” operator. This ensures that the updates are published safely from the main thread.

Finally, we subscribe to the updates on the main thread using the “receive(on:).sink” function and print out the updated name.

Following this approach helps to avoid potential data race conditions and ensures that model updates are performed safely and efficiently.

Similar post

Leave a comment