首页 > 代码库 > iOS---代理与协议以及通知的使用

iOS---代理与协议以及通知的使用

一、代理

1.代理的介绍

     代理是一种通用的设计模式  

   代理使用方式:A 让 B 做件事,空口无凭,签个协议。

     所以代理有三部分组成:

       委托方: 定义协议

       协议   : 用来规定代理方可以做什么,必须做什么

       代理方: 按照协议完成委托方的需求

2. 协议的介绍

  协议是定义了一套公用的接口,是方法的列表,但是无法实现。

  可以通过代理,实现协议中的方法。

  协议是公用方法,一般写在一个类里面。

  如果多个类都使用这个协议,可以写成一个peotocol文件。

3.代理的使用

  (1)委托某人做某事

     先建立一个Custom类,Custom类要买东西,就定下一个协议,实现协议的人,就实现custom协议里的方法。

     Custom.h

#import <Foundation/Foundation.h>
@class Customer;

@protocol CustomerDelegate <NSObject>

@required

-(void)custom:(Customer*)Customer buyThingNum:(int)count;

@end

@interface Customer : NSObject

@property(nonatomic,weak)id<CustomerDelegate>delegate;

-(void)buyThingNum:(int)count;


@end

 

    Custom.m

#import "Customer.h"

@implementation Customer

-(void)buyThingNum:(int)count
{
    if (self.delegate && [self.delegate respondsToSelector:@selector(custom:buyThingNum:)]) {
        [self.delegate custom:self buyThingNum:5];
    }
}

@end

viewController.m

#import "ViewController.h"
#import "Customer.h"
@interface ViewController ()<CustomerDelegate>

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    Customer *custom = [[Customer alloc]init];
    custom.delegate = self;
    [custom buyThingNum:5];
}


-(void)custom:(Customer*)Customer buyThingNum:(int)count
{
    NSLog(@"%d",count);
}
@end

(2)反向传值

     定义一个CustomViewController的类,在CustomViewController.h中定义协议。

#import <UIKit/UIKit.h>

@protocol PassValueDelegate <NSObject>

@required

-(void)buyThingNum:(int)num;

@end

@interface CustomViewController : UIViewController

@property(nonatomic,weak) id<PassValueDelegate>delegate;

@end

 

在CustomViewController.m中定义一个方法,如果设置了代理,并且代理实现了协议的方法,那么就执行代理方法。

#import "CustomViewController.h"

@interface CustomViewController ()

@end

@implementation CustomViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor orangeColor];
}

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    if (self.delegate && [self.delegate respondsToSelector:@selector(buyThingNum:)]) {
        [self.delegate buyThingNum:5];
    }
}

@end

在ViewController类中,设置代理,实现代理方法。

import "ViewController.h"
#import "CustomViewController.h"
@interface ViewController ()<PassValueDelegate>

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor yellowColor];
}

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    CustomViewController *customVC = [[CustomViewController alloc]init];
    customVC.delegate = self;
    [self presentViewController:customVC animated:YES completion:nil];
}

-(void)buyThingNum:(int)num
{
    NSLog(@"%d",num);
}

@end

 

二. 通知

   1. 通知的发送: 系统通过一个叫通知中心进行的,通知中心是一个单例。

    NSNotification *notifacation = [NSNotification notificationWithName:@"passValue" object:@"哈哈" userInfo:@{@"num":@"10"}];
    [[NSNotificationCenter defaultCenter]postNotification:notifacation];

 2.接收通知

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor yellowColor];
    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(buyThingNum:) name:@"passValue" object:nil];
}


-(void)buyThingNum:(NSNotification *)noti
{
    NSString *wordStr  = [noti object];
    
    NSDictionary *dic = [noti userInfo];
    
  //拿到通知的值
NSLog(
@"%@",wordStr); NSLog(@"%@",dic);
}

3.移除通知

    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"passVaule" object:self];

 

打印结果:

2017-06-24 21:53:01.021 DelegateTest[15607:2194987] 哈哈

2017-06-24 21:53:01.021 DelegateTest[15607:2194987] {

    num = 10;

}

 

三、通知与代理的优缺点

 (1)通知可以一对多通信,代理只能一对一。

 (2)代理的执行效率比较高。

 (3)通知的使用比较简单。

 (4)通知太多的情况下,代码比较难维护。

 

iOS---代理与协议以及通知的使用