Ufuk Köşker
Ufuk Köşker

Reputation: 1480

How can I catch that @Published has changed with combine ? (UIKit)

It takes data in my @Published variable in CarDetailViewModel, but I could not pass the data inside this variable to the variable in the ViewController.

ViewModel:

class CarDetailViewModel: ObservableObject {
    @Published var carDetail: Car = Car(brand: "", features: CarFeatures(model: "", km: 0, year: 0, price: 0, image: "", gearType: "", fuelType: "", carVersion: ""))
    
    private var anyCancellable = Set<AnyCancellable>()
    var carSubject = PassthroughSubject<Car, Never>()
    
    func prepareCarDetail() {
        carSubject
            .sink {[weak self] car in
                self?.carDetail = car
                print("car: \(self?.carDetail)") // it is working.
            }
            .store(in: &anyCancellable)
    }
}

ViewController:

When the assignmentDataToUI function runs, the label on the screen is blank.

class CarDetailViewController: UIViewController {
    
    @IBOutlet weak var imageView: UIImageView!
    @IBOutlet weak var brandLabel: UILabel!
    @IBOutlet weak var modelLabel: UILabel!
    @IBOutlet weak var gearTypeLabel: UILabel!
    @IBOutlet weak var fuelTypeLabel: UILabel!
    @IBOutlet weak var priceLabel: UILabel!
    
    var carDetailViewModel = CarDetailViewModel()
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        
        carDetailViewModel.prepareCarDetail()
        assignmentDataToUI()
        
    }
    
    func assignmentDataToUI() {
        brandLabel.text = carDetailViewModel.carDetail.brand
    }
}

Upvotes: 1

Views: 2601

Answers (2)

Deep
Deep

Reputation: 436

In ViewModel

 @Published var text: String = "befor"

In ViewController

private var cancellables = Set<AnyCancellable>()

......

viewModel.$text.sink { text in
   print(text)
}.store(in: &cancellables)

Upvotes: 1

Ufuk K&#246;şker
Ufuk K&#246;şker

Reputation: 1480

I listened to carDetail in ViewModel with sink.

 carDetailViewModel.$carDetail
                .sink {[weak self] car in
                    guard let self = self else { return }
                    self.assignmentDataToUI()
                }
                .store(in: &anyCancelable)

Upvotes: 2

Related Questions