KVO & 알림

3605 단어
KVO:은 특정한 의 속성이 수정되면 KVO가 자동으로 응답하는 (KVC-키 인코딩은 KVO의 기초) 을 알려주는 방송 메커니즘으로 실천이 발생할 때 을 통해 이 시간에 발생하는 모든 관심 대상에게 메시지를 보낼 수 있다.
둘 다 관찰자 모델인데 다른 점은 다음과 같다.KVO은 피관찰자가 에게 직접 메시지를 보낸 것으로 대상 간의 직접적인 상호작용이다. 은 둘 다 통지 센터의 대상과 상호작용을 하고 대상 간에 서로를 모른다.
KVO 사용: addobserver:forkeyPath:options:context: 방법을 통해 observer을 첨가한 다음에 keypath 값이 변하면 에서 방법 observerValueForKeyPath:ofobject:change:context:을 호출하여 이 방법을 실현하여 KVO이 보낸 통지에 응답한다.이 코드들은 모두 에서 실현되었고 은 어떠한 코드도 추가하지 않았기 때문에 누가 등록을 감청하고 응답을 처리하면 된다. 그래서 이 완전히 결합되고 운용이 유연하고 간편하다.그러나 KVO은 클래스의 속성만 검출할 수 있고 속성 이름은 모두 NSString을 통해 찾을 수 있습니다. 컴파일러는 오류 검출과 보완을 도와주지 않으며 맨손으로 두드리면 오류가 발생하기 쉽습니다!
알림 사용:
통지의 발송은 에 의해 통일적으로 발송되고 서로 다른 통지는 유일한 표지명인 notifcationName을 통해 구분되며 표지명은 통지를 발송하는 유형에서 시작된다.먼저 자신이 어떤 방법(A)에서 방법 postNotificationName:object:을 통해 통지 notificationName을 보내면 통지자 쪽의 업무가 완성되고 A가 집행될 때마다 통지 notificationName을 한 번 보낸다.
그리고 감청 A의 변화가 필요하다면 [NSNotificationCenter defaultCenter]의 방법으로 addobserver:selector:name:object 으로 등록감청 통지 명칭이 notificationName이라는 통지를 한다.
매번 통지 명칭이 notificationName이라는 통지를 보낼 때마다 등록 감청 후의 은 자신이 정의한 방법인 notificationselector을 호출하여 상응하게 한다.NSNotification의 특징은 이 먼저 통지를 보내고 이 감청에 등록한 후에 응답을 해야 한다는 것이다. KVO보다 통지를 보내는 단계가 많지만 감청은 속성의 변화에 국한되지 않고 다양한 상태 변화를 감청할 수 있어 감청 범위가 넓고 사용이 유연하다는 장점이 있다.
주의: 관찰자를 마지막으로 제거해야 합니다!!KVO:
1、관찰자 증가
          ,  keyPath           !!!!!
[self.textField addObserver:self forKeyPath:@"text" options:NSKeyValueObservingOptionNew context:nil];

2. 관찰자가 감청 방법을 실현한다.
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
  if ([keyPath isEqualToString:@"text"]) {
  NSLog(@"          ,%@", self.textField.text);
  }
}

3. 실행 방법을 호출한다.
//   -         
  [self.textField setValue:@"123" forKeyPath:@"text"]; //         

  self.textField.text = @"asd"; //        

4. kvo의 관찰자 제거
- (void)dealloc
{
  [self.inputTextField removeObserver:self forKeyPath:@"text"];
}

1. 하나의 통지를 등록하고 하나의 방법을 실현하며 방법과 방법 사이에 독립적이다.
 //      ----     
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldValueChange:) name:@"textFieldValueChangeNotication" object:nil];

2、관찰자 구현 @selector 방법
- (void)textFieldValueChange:(NSNotification *)noti
{
  NSLog(@"%@", noti.userInfo);
}

3. 피관찰자가 통지를 발송한다.
  [[NSNotificationCenter defaultCenter] postNotificationName:@"textFieldValueChangeNotication" object:nil];

4. 관찰자 제거 알림
//        
- (void)dealloc
{
  [[NSNotificationCenter defaultCenter] removeObserver:self];
  //             
  [[NSNotificationCenter defaultCenter] removeObserver:self name:@"textFieldValueChangeNotication" object:nil];
}

좋은 웹페이지 즐겨찾기