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:];
}
} @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:];
} -(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:];
}
} @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":@""}];
[[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---代理、协议、通知 详解的更多相关文章
- “iOS 推送通知”详解:从创建到设置到运行
这是一篇编译的文章,内容均出自Parse.com的iOS开发教程,同时作者还提供了视频讲解.本文将带领开发者一步一步向着iOS推送通知的深处探寻,掌握如何配置iOS推送通知的奥义. 介绍一点点背景资料 ...
- ios开发——实用技术OC-Swift篇&本地通知与远程通知详解
本地通知与远程通知详解 一:本地通知 Local Notification的作用 Local Notification(本地通知) :是根据本机状态做出的通知行为,因此,凡是仅需依赖本机状态即可判 ...
- IOS—UITextFiled控件详解
IOS—UITextFiled控件详解 //初始化textfield并设置位置及大小 UITextField *text = [[UITextField alloc]initWithFrame:CGR ...
- [转帖]技术扫盲:新一代基于UDP的低延时网络传输层协议——QUIC详解
技术扫盲:新一代基于UDP的低延时网络传输层协议——QUIC详解 http://www.52im.net/thread-1309-1-1.html 本文来自腾讯资深研发工程师罗成的技术分享, ...
- 协议分析 - DHCP协议解码详解
协议分析 - DHCP协议解码详解 [DHCP协议简介] DHCP,全称是 Dynamic Host Configuration Protocol﹐中文名为动态主机配置协议,它的前身是 ...
- Memcache的使用和协议分析详解
Memcache的使用和协议分析详解 作者:heiyeluren博客:http://blog.csdn.NET/heiyeshuwu时间:2006-11-12关键字:PHP Memcache Linu ...
- iOS 单元测试之XCTest详解(一)
iOS 单元测试之XCTest详解(一) http://blog.csdn.net/hello_hwc/article/details/46671053 原创blog,转载请注明出处 blog.csd ...
- iOS中—触摸事件详解及使用
iOS中--触摸事件详解及使用 (一)初识 要想学好触摸事件,这第一部分的基础理论是必须要学会的,希望大家可以耐心看完. 1.基本概念: 触摸事件 是iOS事件中的一种事件类型,在iOS中按照事件划分 ...
- IOS中UITableViewCell使用详解
IOS中UITableViewCell使用详解 - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(N ...
- iOS 后台持续定位详解(支持ISO9.0以上)
iOS 后台持续定位详解(支持ISO9.0以上) #import <CoreLocation/CoreLocation.h>并实现CLLocationManagerDelegate 代理, ...
随机推荐
- idea如何搭建springboot框架
首先简单介绍下Spring Boot,来自度娘百科:Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进 ...
- scrapy知识积累
Scrapy 中文文档https://scrapy-chs.readthedocs.io/zh_CN/latest/intro/overview.html 创建项目 scrapy startproje ...
- 【MVC】bootstrap-paginator 分页
[MVC]bootstrap-paginator 分页http://www.cnblogs.com/stoneniqiu/p/4000041.htmlhttp://www.cnblogs.com/Le ...
- 修正剑桥模型预测-用python3.4
下面是预测结果: #!/usr/bin/env python # -*- coding:utf-8 -*- # __author__ = "blzhu" ""& ...
- 开启笔记本win7的虚拟热点笔记本变成wifi
工具/原料 windows 7电脑一台 步骤/方法 1 开启windows 7的隐藏功能:虚拟WiFi和SoftAP(即虚拟无线AP),就可以让电脑变成无线路由器,实现共享上网,节省网费和路由器购买费 ...
- DocumentFragment类型
nodeType 11 nodeName #document-fragment nodeValue NULL parentNode null createdocumentfragment()方法创建了 ...
- DOS的几个常用命令
1.rem:注释 DOS中的注释,其后面的内容会被自动忽略.双冒号(::)也有相同的效果 相当于R语言和Python中的# 2.set:设置变量 set var = 1 将1赋值给变量var 打印出来 ...
- 怎样导入现有的NiosII工程
查找路径
- oracle如何快速导入导出文本格式数据
导出工具:sqluldr2工具说明:sqluldr2再以安装oracle客户端的环境下下无需再安装其它软件,只需将对应的软件包拷贝至对应目录,即可运行导出数据导出示例:--linux环境导出示例:/d ...
- WEB版一次选择多个文件进行批量上传(swfupload)的解决方案
说明:功能完全支持ie和firefox浏览器! 一般的WEB方式文件上传只能使用FileUpload控件进行一个文件一个文件的进行上传,就算是批量上传,也要把文件一个一个的添加到页面,无法如windo ...