gpt4 book ai didi

ios - 将观察者代码从 ViewController 分离到不同的类

转载 作者:行者123 更新时间:2023-12-01 20:17:32 25 4
gpt4 key购买 nike

我想将添加观察者的功能和从 View Controller 中删除的功能分开。目前,我在 viewWillAppear() 中添加观察者方法并删除 viewWillDisappear() 中的观察者.现在,我想要 光 View Controller 将此 View Controller 中的观察者代码分离到其他类。
我想我需要创建一个新类并将这个 View Controller 设置为新的类委托(delegate),但我不确定这一点。如果有人可以帮助我如何做这件事,我将不胜感激。

最佳答案

观察者是什么意思? NS通知中心?也许一个代码片段可能会让它更清楚?

FWIW...viewWillAppear() 和 viewWillDisappear() 可以在每个 View 生命周期内多次调用,所以请记住这一点。在这个扫描仪中应该没问题,只要它们是平衡的。

我通常在 init/dealloc (Objc-C) 或 init/deinit (Swift) 中添加/删除观察者,并使用 isViewLoaded 来确保当 UI 不存在时我不会触摸它,但这取决于你喜欢哪个。

对于您实际的观察者模式,我确实会推出一个新类来处理观察者回调。但是,如果对观察者回调的响应是更新 View Controller 的用户界面,那么您将面临一些关注点分离的挑战。可能最好的办法是让 View Controller 启动一些新类,该类在 init 上自动监听 NSNotificationCenter 事件并在 dealloc 上将其自身删除。然后,定义一个简单的@required 协议(protocol)作为类的弱委托(delegate)。你的 View Controller 可以创建这个对象(或者,更好的测试,让它在初始化时注入(inject)依赖),符合该协议(protocol)并将自己分配为委托(delegate)。

就像是

@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];
}
}

要变得非常聪明,在您设置委托(delegate)之前,您甚至不必费心观察。同样,当没有委托(delegate)时停止观察。

关于ios - 将观察者代码从 ViewController 分离到不同的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36384086/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com