iOS의 관찰자 모드
삼문삼답.
관찰자 모델은 어떤 문제를 해결하기 위한 것일까?관찰자 모델의 정의: 관찰자 모델은 일대다 의존 관계를 정의하여 여러 관찰자 대상이 특정한 주제 대상을 동시에 감청하도록 한다.이 주제의 대상이 상태가 변할 때 모든 관찰자 대상에게 통지하여 자동으로 자신을 업데이트할 수 있도록 한다.요컨대 A와 B, A가 B의 변화에 관심이 있으면 B로 등록한 관찰자는 B가 변할 때 A에게 알리고 B가 변했다고 알려준다.이것도 고전적인 관찰자 모델이라고 한다.
iOS에서 어떤 방안으로 해결되었나요?iOS에서 관찰자 모드의 실현에는 두 가지 방법이 있는데 그것이 바로 Notification, KVO이다.
현재 체계 아래의 구체적인 실현 방안은?1. Notification은 관심 있는 A에게 알림, 즉 등록 관찰자를 정의한다(A는 관찰자, 어떻게 관찰하고 무엇을 하는지 관찰한다)
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notice:) name:@"tongzhi" object:nil];
-(void)notice:(id)sender{
NSLog(@"%@",sender);
}
변화원 B에게 B에서 통지
//
NSNotification *notification = [NSNotification notificationWithName:@"tongzhi" object:nil];
//Name object ( , ) userInfo ( , )
// [NSNotification notificationWithName:@"tongzhi" object:nil userInfo:nil];
//
[[NSNotificationCenter defaultCenter] postNotification:notification];
그럼요. 관찰자를 빼야 해요. dealloc에서.
- (void)dealloc {
// name , object nil, name ,
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"tongzhi" object:nil];
}
KVO는 모두 Key Value Observing이라고 하는데 말 그대로 관찰자 모드가 속성의 변화를 감청하는 데 사용된다. KVO와 NSNotification은 비슷한 점이 많다. addObserver:forKeyPath:options:context 방법으로 관찰하고removeObserver:forKeyPath:context로 관찰자를 제거하고observeValueForKeyPath:ofObject:change:context: 관찰자에게 응답한다.
KVO는 속성의 변화를 쉽게 감지할 수 있습니다. 예를 들어 다음과 같습니다.
// MyTimer , .h name
@property (nonatomic, strong) NSString *name;
// ViewController, controller .h myView
@property (nonatomic, strong) UIView *myView;
//Viewcontroller에 있는.m 파일에서 button을 정의하고 클릭 이벤트를 설정하며 이 이벤트에서 위에서 정의한 두 속성을 각각 호출합니다
int i = 5;
int sum = 15;
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
UIButton *btn = [UIButton buttonWithType:UIButtonTypeSystem];
btn.frame = CGRectMake(100, 100, 100, 30);
[btn setTitle:@" " forState:UIControlStateNormal];
[btn addTarget:self action:@selector(handleTimer:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn];
_label = [[UILabel alloc ] initWithFrame:CGRectMake(100, 200, 180, 30)];
_label.text = @" 15 ";
[self.view addSubview:_label];
// Mytimer
_ourTimer = [[MyTimer alloc ] init];
// name
[_ourTimer addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew || NSKeyValueChangeOldKey context:nil];
// myView
[self addObserver:self forKeyPath:@"myView" options:NSKeyValueObservingOptionNew || NSKeyValueChangeOldKey context:nil];
}
// ,
- (void)handleTimer:(UIButton *)btn {
_ourTimer.name = @" ";
self.myView = nil;
NSLog(@" ");
}
// , ( )
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if ([keyPath isEqualToString:@"name"]) {
NSLog(@" ");
_label.text = [NSString stringWithFormat:@" %d ", i + sum];
sum = i + sum;
} else if ([keyPath isEqualToString:@"myView"]) {
NSLog(@" ");
}
}
//
- (void)dealloc {
[_ourTimer removeObserver:self forKeyPath:@"name"];
[self removeObserver:self forKeyPath:@"myView"];
}
만약 네가 좋아한다면 좋아요를 눌러라.
업데이트: 2017-3-30: KVO는 자신의 속성 변화를 감시하는 것이다. 예를 들어 uilabel 대상의 경우 그는 자신의 속성을 감시한다. 예를 들어text 등이 있을 수 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.