NSNotification, Block, Delegate 및 KVO
Block:
4
block
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];
}
에이전트:
4
delegate
일대일 관계로 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:
4
KVO
(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"];
}
알림:
4
NSNotification
애플이 제공하는 메시지 메커니즘으로 관찰자는 메시지 센터에 등록만 하면 다른 대상이 보낸 메시지를 받아들일 수 있다. 메시지 발송자와 메시지 수용자는 서로 아무것도 모르고 완전히 결합할 수 있다.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];
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.