NSNotification, Block, Delegate 및 KVO

6373 단어
iOS 개발에서 데이터를 전달하는 방법은 여러 가지가 있습니다. 여기서 자주 사용하는 NSNotification, Block,Delegate와 KVO 네 가지 방식을 정리하고 참고만 하겠습니다. 구체적으로 사용하려면 개발 중의 수요와 프로젝트 업무 논리의 수요를 보아야 합니다.적당한 장면과 업무 하에서 적당한 방식을 선택하여 개발 효율을 높이기를 바란다.

Block:


4block OC에서 대상과 대상의 통신 방식으로 일대일 관계이다.컨트롤러와 컨트롤러의 역방향 전송 데이터에 사용할 수 있다.에이전트에 비해 블락은 더욱 간결하고 유연하며 번거로운 프로토콜 방법을 정의할 필요가 없지만 통신 사건이 많으면Delegate를 사용하는 것을 권장합니다.Block을 사용하면self의 사용에 주의하여 순환 인용으로 인한 메모리 유출을 방지해야 합니다.
용법: a류에서 1, 정의와 2, 블록을 리셋하고 b류에서 3, 블록을 실현한다.
예: 하나, 버튼의 트리거 이벤트.1, Block 정의 (매개 변수가 있고 되돌아오는 값 형식이 없음)
@property (nonatomic, copy) void(^didSelectDetailButton)(UIButton *sender);

2, Block의 메타데이터.
- (void)pressDetailBtn:(UIButton *)sender{
  
    if (self.didSelectDetailButton) {
        self.didSelectDetailButton(sender);
    } 
}

3, Block의 구체적 실현.
   cell.didSelectDetailButton = ^(UIButton *sender) {
        
        SALookHaveSharedDetailController *haveVC = [SALookHaveSharedDetailController new];
        haveVC.dataArray = detailArray.mutableCopy;
        [weakSelf.navigationController pushViewController:haveVC animated:YES];
    };

둘째, Block은 뒤에서 앞으로 1을 전송하고 두 번째 보기 컨트롤러에 있습니다.h 파일에서 선언 블록 속성(block 정의)을 정의합니다.
// block
@property (nonatomic,copy) void (^NextViewControllerBlock)(NSString *tfText);

2, .m (block의 콜백)
- (IBAction)BtnAction:(id)sender {
   
    // block 
    if (self.NextViewControllerBlock) {
        self.NextViewControllerBlock(self.inputTF.text);
    }    [self.navigationController popViewControllerAnimated:YES];
}

3, 첫 번째 컨트롤러 (block의 실현)
- (IBAction)btnClicked:(id)sender {

NextViewController*nextVC =[[NextViewController alloc]init];
nextVC.NextViewControllerBlock= ^(NSString *tfText){ self.nextVCInfoLabel.text=tfText; }; [self.navigationController pushViewController:nextVC animated:YES];
}

에이전트:


4delegate 일대일 관계로 setDelegate를 통해 프록시 대상을 설정하는데 가장 전형적인 예는 자주 사용하는 TableView이다.에이전트를 사용하면 호출 프로토콜 방법의 반환값을 받을 수 있고 그 정의 방법은 일정한 규범에 따라 써야 한다. 이렇게 하면 읽기 쉽고 후기 프로젝트의 유지보수와 수정에 유리하다.비교해 보면 코드량이 비교적 크다.
용법: a클래스에서 1, 정의 에이전트와 2, 리셋, b클래스에서 3, 지정 에이전트 대상 4, 협의 5에 따라 에이전트 방법을 실현한다.
예: 1, 에이전트 정의
@property (nonatomic, weak) id delegate; 

@protocol SAAddJobPointRuleCellDelegate 

- (void)tapAddJobPointRule:(SAAddJobPointRuleCell *)ruleCell;

@end

2, 콜백
- (void)tapAddAction:(UITapGestureRecognizer *)sender{
    
    if ([self.delegate respondsToSelector:@selector(tapAddJobPointRule:)]) {
        [self.delegate tapAddJobPointRule:self];
    }
}

3, 프록시 객체 지정
    self.cardSceneView.delegate = self;

4, 프로토콜 준수
@interface TestController ()

5, 에이전트 구현 방법
- (void)tapAddJobPointRule:(SAAddJobPointRuleCell *)ruleCell{
    self.isSelectReset = NO;
    SAGetAllShipperController *allVC = [SAGetAllShipperController new];
    allVC.selectIndex = ruleCell.cellIndex;
      [self.navigationController pushViewController:allVC animated:YES]; 
}

KVO:


4KVO(Key-Value Observing),Foundation 프레임워크가 제공하는 메커니즘으로 일대다 가능.KVO를 사용하면 지정한 대상의 어떤 속성을 쉽게 관찰할 수 있다(한 대상은 다른 대상의 속성 값을 관찰할 수 있고 값의 변화를 발견할 수 있다).관찰된 속성에 대응하는 대상을 추가하고 제거합니다.속성에 반응할 수 있을 뿐 방법이나 동작에 반응할 수 없고 통지를 보내는 것만 책임지고 다른 일은 상관하지 않기 때문에 그들은 값을 되돌려주지 않는다.주의: 우리가 관찰하는 속성은strings로 정의해야 합니다.
사용법: 1.관찰된 대상에서 방법을 호출하여 관찰자 추가:addObserver:forKeyPath:options:context:2.관찰된 속성이 바뀌면 시스템은 이 방법을 사용합니다:observeValueForKeyPath:ofObject:change:context:방법3.관찰자 신분 해제:removeObserver:forKeyPath:context:
예: 1, 속성 정의:
@interface ShipperModel : NSObject

@property (nonatomic, copy) NSString *togetherString;

@property (nonatomic, copy) NSString *separateString;

@end

2, 관찰자 추가
 [_shipperModel addObserver:self forKeyPath:@"togetherString" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:NULL];
  [_shipperModel addObserver:self forKeyPath:@"separateString" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:NULL];

3, 변화 모니터링
#pragma mark -
#pragma mark - KVO
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { 
}

4, 신분 해제
- (void)dealloc {
   
    [self.shipperModel removeObserver:self forKeyPath:@"togetherString"];
    [self.shipperModel removeObserver:self forKeyPath:@"separateString"]; 
}

알림:


4NSNotification 애플이 제공하는 메시지 메커니즘으로 관찰자는 메시지 센터에 등록만 하면 다른 대상이 보낸 메시지를 받아들일 수 있다. 메시지 발송자와 메시지 수용자는 서로 아무것도 모르고 완전히 결합할 수 있다.NSNotification은 모든 시간과 객체에 일대다 적용할 수 있습니다.그러나 통지를 보내는 것만 책임지고 다른 일은 상관하지 않기 때문에 그들은 값을 되돌려 주지 않았다
사용법: a클래스에서 알림을 만들고 제거하며 알림에 응답하는 동작입니다.b 클래스 알림 센터 발송 알림 1, 관찰자 등록 2, 알림 센터에 메시지 보내기 3, 관찰자 제거
예: 1, 알림 센터에 관찰자 추가
- (void)viewDidLoad {
    [super viewDidLoad];  
     [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(fifthStepAction:) name:@“fifthStep” object:nil];
}

2, 알림에 응답하는 이벤트 작업.
//  object   userInfo 
- (void)fifthStepAction:(NSNotification *)noti{
    
    NSDictionary *dict = noti.userInfo;
    self.isSettedSecondDismension = [dict[@"isSetted"] boolValue];
    self.typeName = dict[@"typeName"];
}

//- (void)fifthStepAction:(NSNotification *)noti{
    
//    self.isFromAddSureBack = [noti.object boolValue];
//}

3, 알림 제거
- (void)dealloc{
    [[NSNotificationCenter defaultCenter]removeObserver:self]; 
}

4, 알림 센터 알림 보내기
// object   userInfo 
  if (self.isTest) {
            NSNotification *noti = [[NSNotification alloc]initWithName:@“fifthStep”  object:nil userInfo:dict];
            [[NSNotificationCenter defaultCenter] postNotification:noti];
           
            [self.navigationController popToViewController:targetVC animated:YES]; 
        }

좋은 웹페이지 즐겨찾기