iOS 공유 - 개체 간 통신의 delegate, notificationCenter 및 Block

6381 단어
프로젝트 개발에서 흔히 대상 간의 통신과 관련된다. 대상 간의 결합을 낮추기 위해delegate,notificationCenter,block 세 가지 방식으로 이루어진다. 그들의 사용에 대해 모두가 능숙하게 파악할 수 있을지 모르지만 어떻게 만드는지에 대해 초보자는 반밖에 모른다. 본고는 장황한 말을 하지 않고 간단한 실례를 통해 세 사람의 사용을 배울 수 있다.상기 세 가지를 잘 모르는 친구에게 어느 정도 도움이 되었으면 합니다.
delegate
아마도 여러분들이 가장 자주 사용하는delegate는 UItable View Delegate일 것입니다. 그러면 우리는 어떻게 스스로 에이전트를 씁니까?우리는 항상 컨트롤러에서 어떤 보기에서 단추의 클릭을 감청한다. 예를 들어.만약 DTESView에 Button이 있다면, 우리는 DTESViewController에서 이 단추의 클릭을 감청하고, Button을 눌렀을 때 DTESViewController에게 그룹을 전달해야 한다. 코드는 다음과 같다.
//1、 DTestView.h 
@class DTestView;
@protocol DTestViewDelegate <NSObject>
@optional
/** */
- (void)dTestViewDidClickBtn:(DTestView*)dTestView withArr:(NSArray *)position;
@end

//2、 DTestView.h delegate 
@interface DTestView : UIView
@property (nonatomic, weak) id <DTestViewDelegate> delegate; @end

//3、 DTestView.m Button delegate - (void)btnClick { if ([self.delegate respondsToSelector:@selector(dTestViewDidClickBtn:withArr:)]) { NSArray *arr = @["test", "delegate"]; [self.delegate dTestViewDidClickBtn:self withArr:arr]; } }

창설 에이전트는 총 3단계입니다. 어때요? 간단하죠?하지만 이 중에서도 몇 가지 주의해야 할 점이 있다.
1. 명명 규범: 클래스 이름 + Delegate.
2. @optional 키워드: 프로토콜에 따라 이 프로토콜 방법은 실현되지 않을 수 있습니다. 프로토콜 방법은 기본적으로 @required 수식입니다. 즉, 프로토콜에 따라 이 방법을 실현해야 하며 반드시 실현해야 하는 방법이 아닌 @optional 수식을 권장합니다.
3. ARC 환경에서 delegate 속성은 weak로 수식한다.
4. 프록시 방법을 호출하기 전에respondsToSelector: 방법을 이용하여 프록시 방법이 존재하는지 판단한다.
이상은delegate를 만들 때 주의사항입니다. 왜 이러는지 생각해 보십시오. 만약에 모르는 점이 있으면 질문을 환영하고 잘못된 점이 있으면 지적을 환영합니다.
다음은 delegate의 사용입니다. 간단하게 말하면 3단계입니다.
//1、 
- (void)viewDidLoad {
   [super viewDidLoad];
   dTestView *view = [[dTestView alloc] init];
   view.delegate = self;
   [self.view addSubview:view];    
}

//2、 
@interface DTestViewController ()<DTestViewDelegate>

//3、 
- (void)dTestViewDidClickBtn:(DtestView *)dTestView withArr:(NSArray *)arr {
   NSLog(@"%@", arr);
}

자, 이것은 간단한delegate의 생성과 사용입니다.
2. notificationCenter
알림 센터는 비교적 간단합니다. 감청 단추를 누르고 그룹을 전달하는 예를 들어 NTESView에서 알림을 발표합니다.
// Button addTarget 
- (void)btnClick {
   NSArray *arr = @[@"test", @"notificationCenter"];
   [[NSNotificationCenter defaultCenter] postNotificationName:@" " object:nil userInfo:arr];
}

끝나다이렇게 간단합니다. NTESViewController에 관찰자를 추가합니다.
// 
- (void)viewDidLoad {
   [super viewDidLoad];
   [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(nTestViewDidClickBtn:) name:@" " object:nil];
}
/** */
- (void)nTestViewDidClickBtn:(NSNotification *)note {
   NSArray *arr = note.userInfo;
   NSLog(@"%@", arr);
}

// 
- (void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

매개변수를 설명하십시오.
name: 알림의 이름
object: 전달할 객체
userInfo: 발표 알림은 전달된 정보입니다(관찰자를 추가할 때 기본적으로 이 파라미터를 받을 수 있습니다)
이상은 notificationCenter의 간단한 사용입니다.주의: 감청이 필요 없을 때는 반드시 관찰자를 제거해야 한다.
3. Block(클립)
Block의 간단한 사용은 감청 단추를 누르고 그룹을 전달하는 것을 예로 들 수 있습니다.
//1、 BtestView.h , :
@interface BTestView : UIView
/**block */
@property(nonatomic,copy) void(^arrBlock)(NSArray *);

/** */
+ (instancetype)bTestViewWithArrBlock:(void(^)(NSArray *arr))arrBlock;
@end

//2、 BTestView.m , :
+ (instancetype)bTestViewWithaArrBlock:(void(^)(NSArray *arr))arrBlock {
    BTestView *view = [[BTestView alloc] init];
    _arrBlock = arrBlock;
    return view;
}

//3、 Button addTarge arrBlock
- (void)clickBtn {
  NSArray *arr = @[@"test", @"notificationCenter"];
  _arrBlock(arr); 
}

NtestViewController에서 Block 사용:
- (void)viewDidLoad {
   [super viewDidLoad];
   BTestView *view = [BTestView bTestViewWithArrBlock:^(NSArray *arr){
    NSLog(@"%@", arr);
  }]; 
  [self.view addSubview:view]; 
}

혹시 Block 사용법을 보셨을 때 익숙함이 있으신가요?
주의: Block 속성은copy로 수식해야 하며, 동시에 사용할 때 순환 인용을 일으키지 않도록 주의해야 합니다.
이 세 가지 통신 방식에 대해 구체적으로 어떤 것을 써야 합니까?이것은 실제 프로젝트와 결합해야만 선택을 할 수 있다. 흔히 볼 수 있는 말은 한 쌍의 다중 통신용 notification Center, 한 쌍의 통신 방법이 적은 경우는 Block, 방법이 많은 경우delegate이다.
주의: 상기 코드는 모두 실제 테스트를 통과하지 못했기 때문에 본고는 간단한 사용 방향만 제공한다.

좋은 웹페이지 즐겨찾기