iOS의 관찰자 모드

3881 단어
iOS 관찰자 모드가 뭐냐고 물어보고 소개한 뒤 응답자가 입을 벌리면 NSNotificationCenter에 와서 어떻게 사용하냐고 묻자 GG가 됐고, 이를 보고도 고정된 생각이 없는 내가 바로 정리했다.
삼문삼답.
관찰자 모델은 어떤 문제를 해결하기 위한 것일까?관찰자 모델의 정의: 관찰자 모델은 일대다 의존 관계를 정의하여 여러 관찰자 대상이 특정한 주제 대상을 동시에 감청하도록 한다.이 주제의 대상이 상태가 변할 때 모든 관찰자 대상에게 통지하여 자동으로 자신을 업데이트할 수 있도록 한다.요컨대 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 등이 있을 수 있다.

    좋은 웹페이지 즐겨찾기