2017-03-26 3 views
1

マイオブジェクト:私は、オブジェクトの作成オブジェクトがClassAで作成された場合、ClassBで観察する方法は?

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

ClassAclassB

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

を、私は、新しいオブジェクトが作成されたかどうかを観察したい:

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

'a'は実際にはローカル変数ですo 'somefunc()'? –

+0

これは、ユーザーにテキストを表示する方法であれば、アーキテクチャを再考する必要があります。あなたは 'instanceOfB.text = instanceOfText'のようなコードを明示的に記述し、' didSet'ですでに行っているようにしたいと思うでしょう。 'Text'のインスタンスが作成された瞬間を聞くことで、特に' Text'インスタンスが複数のスレッドから同時に作成できる場合、UIバグがどこから来るのかはほとんど分かりません。私が示唆しているように明示的に記述することで、ブレークポイントを置いてメインスレッドのスタックトレースだけを掘り下げることができます。 –

答えて

1

委任

あなたが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)") 
    } 
} 

これだけです!オブジェクトTextsomefunc()方法で作成されたときに呼び出されます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 
+0

これは解決策かもしれませんが、私はそのような場合に委任を使用することが最善の選択ではないと考えています。 –

+0

通知ソリューションはどうですか? –

+0

@DanhHuynh私は両方を試してみましたが、どちらもうまくいきました。どうもありがとうございました。通知のある方は、このプロトコルに慣れ親しんだ "b.a.somefunc"コールが原因で、より自然なように見えました。興味深いのは、どちらの方法がより安全か、または観察のための好ましい方法かを知ることです。もう一度おかげさまで、私は多くを助けました:) – imrano10

関連する問題