将ViewController中的Observer代码分离到另一个类

时间:2016-04-03 10:08:05

标签: ios uiviewcontroller

我想分离添加观察者及其从视图控制器中删除的功能。目前,我正在viewWillAppear()方法中添加观察者并删除viewWillDisappear()中的观察者。现在,我希望光视图控制器将此视图控制器中的观察者代码分离到其他类。 我想我需要创建一个新类并将此视图控制器设置为新的类委托,但我不确定。如果有人能帮助我做这件事,我真的很感激。

1 个答案:

答案 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];
    }
}

为了变得非常聪明,在你有一个委托集之前,你甚至不能打扰观察。同样,在没有代表时停止观察。