당신이 나를 사랑하지 않을 때 나에게 말해 주세요 (KVC/KVO/NSNotification)

6417 단어

KVC KVO NSNotification


KVC

  • 기본 개념
  • 이것은 문자열 형식의 속성 이름(key)을 통해 특정한 종류의 속성에 직접 접근할 수 있는 메커니즘이다.Setter, Getter를 호출하는 대신 액세스할 수 있습니다.
  • 모든 NSObject 객체에서 KVC를 사용할 수 있습니다.
  • KVC는 대상 값이 있는 속성도 지원하고 기본 데이터 형식과 구조도 지원한다.기본 데이터 형식은 자동으로 봉인되고 해체됩니다.

  • 기본 사용
  • 통과setValue: forKey:를 통해 객체의 값을 설정합니다.
  • valueForKey:를 통해 대상의 값을 얻는다.
  • 지정된 경로의 객체 값을 setValue: forKeyPath:로 설정합니다.
  • valueForKeyPath:를 통해 지정된 경로의 객체 값을 가져옵니다.


  • 예제 코드는 다음과 같습니다.
    ```objc    
    //Person.h
    
    @interface Person : NSObject
    
    @property (nonatomic, copy) NSString *name;
    @property (nonatomic, assign) NSInteger age;
    @property (nonatomic, strong) Person *girlFriend;
    @property (nonatomic, copy) NSArray *books;
    
    @end
    ```     
    
    ```objc    
    - (void)viewDidLoad {
        [super viewDidLoad];
    
        Person *person = [[Person alloc] init];
        
        NSLog(@"1: %@ - %ld", person.name, person.age);
        
        [person setValue:@"Bourne" forKey:@"name"];
        [person setValue:@21 forKey:@"age"];
        
        NSLog(@"2: %@ - %ld", [person valueForKey:@"name"], person.age);
        
        Person *girl = [[Person alloc] init];
        [person setValue:girl forKey:@"girlFriend"];
        
        NSLog(@"3: %@ - %ld", [person valueForKeyPath:@"girlFriend.name"], person.girlFriend.age);
        
        [person setValue:@"willYou?" forKeyPath:@"girlFriend.name"];
        [person setValue:@20 forKeyPath:@"girlFriend.age"];
        
        NSLog(@"4: %@ - %ld", person.girlFriend.name, person.girlFriend.age);
    }
    ```        
     
    ** **       
    
    ```
    2015-04-06 16:49:19.192 KVC-KVO-test[5685:7429728] 1: (null) - 0
    2015-04-06 16:49:19.193 KVC-KVO-test[5685:7429728] 2: Bourne - 21
    2015-04-06 16:49:19.194 KVC-KVO-test[5685:7429728] 3: (null) - 0
    2015-04-06 16:49:19.194 KVC-KVO-test[5685:7429728] 4: willYou? - 20
    ```           
    
  • 일대다 관계
  • NSArray 등 집합 형식 데이터에 포함된 대상에게 요청 메시지를 보내면, 그룹의 모든 대상을 조회하여 이 키 값을 찾고, 포장된 그룹을 되돌려줍니다.
  • 그룹 등 집합 형식의 데이터에 포함된 대상에게 값 부여 메시지를 보내려면, 그룹의 모든 대상을 조회해서 이 키 값을 찾고 같은 값을 부여합니다.주의: 찾은 대상을 순서대로 값을 매기도록 그룹을 보내려고 하지 마십시오. 그러면 오류가 발생합니다.

  • 예제 코드는 다음과 같습니다.
    //Book.h
    
    @interface Book : NSObject
    
    @property (nonatomic, assign) NSInteger price;
    
    @end
    
    - (void)setAndGetBooks {
        Person *person = [[Person alloc] init];
        
        Book *book1 = [[Book alloc] init];
        Book *book2 = [[Book alloc] init];
        Book *book3 = [[Book alloc] init];
        
        NSArray *myBooks = @[book1, book2, book3];
        
        [person setValue:myBooks forKey:@"books"];
        
        NSLog(@"1: %@", [person valueForKeyPath:@"books.price"]);
        
        [person setValue:@1 forKeyPath:@"books.price"];
        
        NSLog(@"2: %@", [person valueForKeyPath:@"books.price"]);
    }
    
    인쇄 출력
        2015-04-06 17:12:48.256 KVC-KVO-test[5886:7519923] 1: (
        0,
        0,
        0
    )
    2015-04-06 17:12:48.257 KVC-KVO-test[5886:7519923] 2: (
        1,
        1,
        1
    )
    

    2. KVO

  • 기본 개념
  • KVO: Key-Value Observing은 지정된 객체의 속성이 수정되면 객체가 알림을 받는 메커니즘을 제공합니다.KVO는 지정된 관찰 대상의 속성이 수정될 때마다 해당 관찰자에게 자동으로 통지한다.비공식적인 프로토콜에 속한다.
  • 기본 데이터 유형, 대일 또는 대여 관계를 포함하여 임의의 속성을 관찰할 수 있다.다중 관계에 대한 관찰자는 변화가 발생하는 유형, 임의로 변화가 발생하는 대상도 알려준다.

  • 사용 방법
  • 관찰자를 등록하고 피관찰자의 속성을 지정한다.
  • 리셋 방법을 실현하고 변경 통지를 받는다.
  • 관찰자의 신분을 제거한다.

  • 등록 관찰자는 속성의 변경 통지를 정확하게 수신하기 위해 관찰자는 먼저 addObserver:forKeyPath:options:context: 메시지를 피관찰자에게 보내야 한다.관찰이 필요한 대상과 관찰이 필요한 속성을 전달하는 관건적인 경로로 선형 파라미터는 변경이 발생할 때 관찰자에게 제공하는 정보를 지정하고 NSKeyValueObservingOptionNew를 사용하면 리셋 방법에서 옛 값을 얻을 수 있으며 NSKeyValueObservingOptionOld를 사용하면 리셋 방법에서 새로운 값을 얻을 수 있다.예제
    [person addObserver:self forKeyPath:@"books.price" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL];
    
  • 리셋 방법은 감청 속성이 변할 때 굳건하게 버티면 observeValueForKeyPath: ofObject: change: context: 메시지를 받을 수 있다.관찰을 촉발하는 대상, 키 경로, 변화의 세부 사항을 포함하는 사전은 관찰자에게 전달된다.
        -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {  
        if([keyPath isEqualToString:@"books.price"]) {  
            NSLog(" !");  
        }  
    } 
    
  • 관찰자를 제거하면 관찰자를 포함하는 키 경로를 보내는 방법``을 관찰된 대상에게 보내서 이 관찰을 제거할 수 있습니다.주의: 관찰자를 등록하면 수동으로 관찰자를 제거해야 합니다!
    [person removeObserver:self forKeyPath:@"books.price"];
    

  • 3. NSNotification

  • 개술은 KVO와 달리 KVO는 속성상 K-V를 통해 변경될 때 자동으로 호출observeValueForKeyPath: ofObject: change: context: 방법을 사용하고 NSNotification은 필요할 때 스스로 알림을 보내야 호출하며 방법이 사용자 정의된다.
  • 사용 방법
  • NSNotificationCenter에서 관찰자를 등록할 때 이벤트(문자열로 이름) 및 이벤트가 트리거될 때 실행할 Selector 또는 Block
  • 지정
  • NSNotificationCenter는 어느 시기에 이벤트(문자열로 명명)를 자극합니다. 주의: 컴파일러는 이 이벤트의 이름에 따라 이전에 이 이름을 등록한 관찰자를 찾았기 때문에 이 이름은 보통 정적 속성으로 설정하여 두 번 사용하면 같은 문자열을 사용할 수 있습니다!
  • 관찰자가 관심 있는 사건을 받았을 때 해당하는 Selector 또는 Block
  • 을 실행한다.
  • 등록 관찰자는 기본적인 알림센터를 사용하여 관찰자, 받아야 할 알림의 이름, 알림을 받을 때 실행하는 방법을 지정한다. 마지막 매개 변수는 어느 발송자 대상이 보낸 이벤트에 응답할 것인지,nil일 때 모든 발송자의 이벤트를 받아들일 것인지를 표시한다.
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(action:) name:@"NOTIFICATION_NAME" object:nil];
    
  • 관찰자를 자극하려면 알림의 이름을 지정해야 한다. 컴파일러는 이 사건의 이름에 따라 이전에 이 이름을 등록한 관찰자를 찾을 수 있고 관찰자에게 전달할 대상도 지정할 수 있다.
    NSObject *test = [[NSObject alloc] init]; 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"NOTIFICATION_NAME" object:test];     
    
    // :   
    
    NSNotification *notification = [NSNotification  notificationWithName:@"NOTIFICATION_NAME" object:test];      
    [[NSNotificationCenter defaultCenter] postNotification:notification];
    
  • 집행사건 관찰자는 통지를 받은 후 등록 시 지정한 방법을 집행하고 피관찰자가 반송하는 대상을 얻는다.
    - (void)action:(NSNotification *)notification {
        NSLog(" !");
    } 
    

  • 설명:

  • 이상의 내용은 본인이 정리한 노트에 속하므로 잘못된 부분이 있으면 저에게 알려주시고 모두 함께 발전하시기 바랍니다.
  • 이상의 내용 중 일부 단락이나 문장은 본인이 다른 지방Copy에서 왔을 수 있습니다. 만약에 권리 침해가 있으면 제때에 저에게 알려주십시오.
  • 좋은 웹페이지 즐겨찾기