如果在Class中创建了对象,如何在B类中观察?

How to observe in ClassB if an object is created in ClassA?

我的对象:

//Object to observe
struct Text {
    let savedUserHeader: String
    let savedUserText: String
}

ClassA 我创建对象的地方:

//First Class 
class A {
   func somefunc(){
      let a = Text(savedUserHeader: "testHeader", savedUserText: "testText")
    }
}

classB中,我想观察是否创建了一个新对象:

//Second Class
class B {
  var text: Text? {
      didSet{
        headerlabel.text = text.savedUserHeader
        saveUserLabel.text = text?.savedUserText
       }
   }
}

代表

可以使用Delegate模式来观察,让我们创建一个名为ADelegate:

的协议
protocol ADelegate {
    func didCreateText(text: Text)
}

然后,在classA中添加一个名为delegate的变量,并将Text对象传递给somefunc()中的didCreateText(text:)方法:

//First Class
class A {

    var delegate: ADelegate?

    func somefunc(){
        let a = Text(savedUserHeader: "testHeader", savedUserText: "testText")
        delegate?.didCreateText(text: a)
    }
}

接下来,当你在B中创建对象A时,设置a.delegate = self并实现ADelegate协议:

//Second Class
class B: ADelegate {

    var headerlabel: UILabel!
    var saveUserLabel: UILabel!

    var a = A()

    var text: Text? {
        didSet{
            headerlabel.text = text?.savedUserHeader
            saveUserLabel.text = text?.savedUserText
        }
    }

    init() {
        a.delegate = self
    }

    func didCreateText(text: Text) {
        print("savedUserHeader: \(text.savedUserHeader)")
        print("savedUserText: \(text.savedUserText)")
    }
}

就是这样!当在somefunc()方法中创建对象Text时,将调用方法didCreateText(text:)

let b = B()
b.a.somefunc()

通知中心

另一个解决方案是 NotificationCenter。让 post 在创建 Text 对象时发出通知:

func somefunc(){
    let a = Text(savedUserHeader: "testHeader", savedUserText: "testText")
    NotificationCenter.default.post(name: Notification.Name("addText"), object: a)
}

并观察 class B:

init() {
    NotificationCenter.default.addObserver(self, selector: #selector(observeText(noti:)), name: Notification.Name("addText"), object: nil)
}

@objc func observeText(noti: Notification) {
    if let text = noti.object as? Text {
        print("savedUserHeader: \(text.savedUserHeader)")
        print("savedUserText: \(text.savedUserText)")
    }
}

让我们测试一下:

let b = B()
let a = A()
a.somefunc()

您将看到结果:

savedUserHeader: testHeader
savedUserText: testText