如何防止将变量初始化两次?

时间:2019-01-10 04:37:45

标签: ios swift xcode architecture

我是iOs应用程序开发的新手,我想知道我的应用程序架构是否正确。应用程序中的错误使我相信我的某些变量已多次初始化。

总结我的应用程序:2个屏幕和2个视图,但只有一个控制器。根据当前视图,viewDidLoad具有不同的结果。 我不认为这是正确的做法。我想这个想法是为每个视图创建一个控制器?

但是我主要关心的是:在viewDidLoad中,加载主屏幕时,我设置了一个通知观察器。我相信(由于错误),每次屏幕加载时都会设置此观察器,然后多次调用它。

我的问题在这里:在哪里放置此侦听器,是否有一个位置仅在加载此视图后才运行代码?应该通过将此侦听器放入变量中来解决此问题?

AppDelegate应用程序功能是否适合此类情况?

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    // Remove iphone sleep mode
    UIApplication.shared.isIdleTimerDisabled = true

    //Setup the external scanner object
    self.scanner.delegate = self
    self.scanner.connect()

    // Init the saved values
    let defaults = UserDefaults.standard

    // --------------- MAIN VIEW ---------------
    if(mainView != nil){

        // Add a notification receiver
        // Will receive results ### request
        NotificationCenter.default.addObserver(self, selector: #selector(mainTextNewLineNotification), name: Notification.Name(rawValue: "sendingToView"), object: nil)

        // Layout setup
        mainTextView.layer.cornerRadius = 6.0

        [...]
    }

    // --------------- SETTINGS VIEW ---------------
    if(settingsView != nil){

        //Fill the field with saved values
        inputHost.text = defaults.string(forKey: "hostname")
        inputPort.text = String(defaults.integer(forKey: "port"))
        if(defaults.string(forKey: "timeout") != nil){
            inputTimeout.text = defaults.string(forKey: "timeout")
        }
        if(UserDefaults().string(forKey: "confirmSwitch") == "On"){
            confirmSwitch.isOn = true
        } else {
            confirmSwitch.isOn = false
        }
    }
}

1 个答案:

答案 0 :(得分:0)

  1. 在这种情况下,您无需关心removeObserver逻辑(因为您使用的是-selector而不是-block的简单预订)。从苹果doc: 如果您的应用程序针对iOS 9.0和更高版本或macOS 10.11和更高版本,则无需在其dealloc(deinit)方法中注销观察者。

  2. 每次初始化UIViewController的实例时,如果系统加载了它的视图,则每次都会调用viewDidLoad。在UIViewController生命周期内, viewDidLoad 被称为一次。因此,您的订阅逻辑是正确的。

我不知道您的应用程序的完整逻辑,因此很难找出错误的原因。