위임
당신은 관찰 위임 패턴을 사용하여 만들 수 있도록하는 프로토콜 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)")
}
}
그게 전부 야! 객체 Text
가 somefunc()
방법으로 생성 될 때 호출됩니다 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
'a'는 실제로 변수의 지역 변수입니다. o'somefunc()'? –
사용자에게 텍스트를 표시하는 방법이라면 아키텍처를 다시 고려해야합니다. 당신은'instanceOfB.text = instanceOfText'와 같은 코드를 명시 적으로 작성하고'didSet'에서 이미 수행하고있는 것처럼 할 수 있습니다. 'Text '인스턴스가 만들어지는 순간을 들음으로써, 특히'Text' 인스턴스가 여러 스레드에서 동시에 생성 될 수있는 경우 UI 버그가 어디서 발생하는지 거의 알 수 없습니다. 명시 적으로 필자가 제안하는대로 중단 점을 넣고 주 스레드의 스택 추적을 통해 파헤칠 수 있습니다. –