Coder Social home page Coder Social logo

Comments (3)

regexident avatar regexident commented on June 1, 2024

self.observe(theme: \Theme.view) should only ever be called once within the lifetime of an object (i.e. self here).

Handling Disposable is only necessary for the class-level API.

from gestalt.

devkokodev avatar devkokodev commented on June 1, 2024

i tried on demo project with only two controllers this is logs

*** 0x0000000103106690 Firs view controller regiseter for theme first theme
*** 0x0000000103121190 Second view controller regiseter for theme second theme
*** 0x0000000103121190 Second view controller deinit
*** 0x0000000103113540 Second view controller regiseter for theme second theme
*** 0x0000000103113540 Second view controller deinit
*** 0x000000010301eda0 Second view controller regiseter for theme second theme
*** 0x000000010301eda0 Second view controller deinit
*** 0x000000010301eda0 Second view controller regiseter for theme second theme
*** 0x000000010301eda0 Second view controller deinit
*** 0x000000010301eda0 Second view controller regiseter for theme second theme
*** 0x000000010301eda0 Second view controller deinit
*** 0x000000010301eda0 Second view controller regiseter for theme second theme
*** 0x000000010301eda0 Second view controller deinit
*** 0x0000000103113540 Second view controller regiseter for theme second theme
*** 0x0000000103113540 Second view controller deinit

As you can see few times second view contoller has same memory address

App delegate:
window = UIWindow(frame: UIScreen.main.bounds) window?.rootViewController = UINavigationController(rootViewController: FirstViewController()) window?.makeKeyAndVisible() ThemeManager.default.theme = ApplicationTheme.light

First view controller:
`class FirstViewController: UIViewController, Themeable {

var pushButton = UIButton(frame: CGRect(x: 100, y: 500, width: 100, height: 50))

override func viewDidLoad() {
    super.viewDidLoad()
    pushButton.setTitle("push", for: .normal)
    pushButton.setTitleColor(.black, for: .normal)
    pushButton.addTarget(self, action: #selector(onPush), for: .touchUpInside)
    view.addSubview(pushButton)
    setThemeObserve()
}


    typealias Theme = FirstVCTheme

    func setThemeObserve() {
        self.observe(theme: \ApplicationTheme.firstTheme)
        print("*** \(Unmanaged.passUnretained(self).toOpaque()) Firs view controller regiseter for theme first theme")
    }

    func apply(theme: Theme) {
        view.backgroundColor = theme.backgroundColor
    }

@objc func onPush() {
    self.navigationController?.pushViewController(SecondViewController(), animated: true)
}

}`

Second view controller: `class SecondViewController: UIViewController, Themeable {

override func viewDidLoad() {
    super.viewDidLoad()

    setThemeObserve()
}

deinit {
    print("*** \(Unmanaged.passUnretained(self).toOpaque()) Second view controller deinit")
}

    typealias Theme = SecondVCTheme

    func setThemeObserve() {
        self.observe(theme: \ApplicationTheme.secondTheme)
        print("*** \(Unmanaged.passUnretained(self).toOpaque()) Second view controller regiseter for theme second theme")
    }

    func apply(theme: Theme) {
        view.backgroundColor = theme.backgroundColor
    }

}`

AplicationTheme:
`enum ThemeType: Int {
case light
case dark
}

struct ApplicationTheme: Theme {

let firstTheme: FirstVCTheme
let secondTheme: SecondVCTheme

static let light = ApplicationTheme(firstTheme: FirstVCTheme(type: .light),
                                    secondTheme: SecondVCTheme(type: .light))
                                   

static let dark = ApplicationTheme(firstTheme: FirstVCTheme(type: .dark),
                                   secondTheme: SecondVCTheme(type: .dark))

}

struct SecondVCTheme: Theme {
let backgroundColor: UIColor

init(type: ThemeType) {
    switch type {
    case .light:
        backgroundColor = .cyan
    case .dark:
        backgroundColor = .brown
    }
}

}

struct FirstVCTheme: Theme {
let backgroundColor: UIColor

init(type: ThemeType) {
    switch type {
    case .light:
        backgroundColor = .red
    case .dark:
        backgroundColor = .yellow
    }
}

}`

from gestalt.

regexident avatar regexident commented on June 1, 2024

If you get "Detected redundant observation" with func viewDidLoad(), then try moving self.observe(theme: …) into the initializer instead.

from gestalt.

Related Issues (13)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.