2017-03-26 1 views
1

내 개체 : 나는 객체 생성ClassA에서 객체가 생성 된 경우 ClassB에서 관찰하는 방법은 무엇입니까?

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

ClassA : classB에서

//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) 
} 

을의 somefunc()의 클래스 A에 delegate라는 변수를 추가하고 didCreateText(text:) 방법에 Text 개체를 전달할 :

를 당신은 B에서 개체 A를 만들 때
//First Class 
class A { 

    var delegate: ADelegate? 

    func somefunc(){ 
     let a = Text(savedUserHeader: "testHeader", savedUserText: "testText") 
     delegate?.didCreateText(text: 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() 

알림 센터

또 다른 해결책은 NotificationCenter입니다.

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

와 클래스 B의 관찰 :하십시오 Text 객체를 생성 할 때 알림을 게시하자

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