我想分离添加观察者及其从视图控制器中删除的功能。目前,我正在viewWillAppear()
方法中添加观察者并删除viewWillDisappear()
中的观察者。现在,我希望光视图控制器将此视图控制器中的观察者代码分离到其他类。
我想我需要创建一个新类并将此视图控制器设置为新的类委托,但我不确定。如果有人能帮助我做这件事,我真的很感激。
答案 0 :(得分:2)
Observer是什么意思? NSNotificationCenter?也许代码片段可能会让它更清晰?
FWIW ... viewWillAppear()和viewWillDisappear()可以在每个视图生命周期中多次调用,所以请记住这一点。只要它们是平衡的,这个scanerio应该没问题。
我通常在init / dealloc(Objc-C)或init / deinit(Swift)中添加/删除观察者,并使用isViewLoaded确保我不触摸UI,但它不存在但是它没有取决于你喜欢的。
对于你的实际观察者模式,我确实会打破一个新类,用于处理观察者回调。但是,如果对观察者回调的响应是更新视图控制器的用户界面,那么您就会有一些关注点分离的挑战。可能最好的事情是视图控制器启动一些新的类,它自动侦听init上的NSNotificationCenter事件并在dealloc上自行删除。然后,将一个简单的@required协议定义为该类的弱委托。您的视图控制器可以创建此对象(或者,更好地进行测试,在init中注入依赖项),符合该协议并将自己指定为委托。
像
这样的东西@protocol MyObservable {
@required
-(void)myXYZEventDidOccur;
}
@interface MyObserver : NSObject {
-(instancetype)initWithDelegate:(id<MyObservable>)delegate;
}
@interface MyObserver ()
@property (nonatomic, weak, readwrite, nullable) id<MyObservable>delegate;
}
@implementation MyObserver {
-(instancetype)initWithDelegate:(id<MyObservable)delegate {
self = [super init];
if(self == nil) { return nil; }
self.delegate = delegate;
[NSNotificationCentre defaultCentre] addObserver...];
}
-(void)dealloc {
[NSNotificationCentre defaultCentre] removeObserver...];
}
-(void)didReceiveNotificationXYZ:(NSNotification *)notification {
[self.delegate myXYZEventDidOccur];
}
}
为了变得非常聪明,在你有一个委托集之前,你甚至不能打扰观察。同样,在没有代表时停止观察。