委任
あなたがADelegate
と呼ばれるプロトコルを作成してみましょう、観察するために委任パターンを使用することができます。
protocol ADelegate {
func didCreateText(text: Text)
}
その後、クラスAにdelegate
という変数を追加し、somefunc()
にdidCreateText(text:)
方法に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)")
}
}
これだけです!オブジェクトText
がsomefunc()
方法で作成されたときに呼び出されますdidCreateText(text:)
方法:
let b = B()
b.a.somefunc()
通知センター
別の解決策は、通知センターです。 Text
オブジェクトを作成するときに通知を投稿してみましょう:
func somefunc(){
let a = Text(savedUserHeader: "testHeader", savedUserText: "testText")
NotificationCenter.default.post(name: Notification.Name("addText"), object: a)
}
とクラス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
'a'は実際にはローカル変数ですo 'somefunc()'? –
これは、ユーザーにテキストを表示する方法であれば、アーキテクチャを再考する必要があります。あなたは 'instanceOfB.text = instanceOfText'のようなコードを明示的に記述し、' didSet'ですでに行っているようにしたいと思うでしょう。 'Text'のインスタンスが作成された瞬間を聞くことで、特に' Text'インスタンスが複数のスレッドから同時に作成できる場合、UIバグがどこから来るのかはほとんど分かりません。私が示唆しているように明示的に記述することで、ブレークポイントを置いてメインスレッドのスタックトレースだけを掘り下げることができます。 –