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 代理, ...
随机推荐
- 2018.12.23 bzoj2865&&1396: 字符串识别(后缀自动机+线段树)
传送门 卡空间差评! 题意简述:给一个字串,对于每个位置求出经过这个位置且只在字串中出现一次的子串的长度的最小值. 解法:先建出samsamsam,显然只有当sizep=1size_p=1sizep ...
- 2018.11.01 bzoj4325: NOIP2015 斗地主(贪心+搜索)
传送门 原来一直以为是一道大模拟. 没想到是一道搜索+最优性剪枝 如何搜最优呢? 我们考虑怎么最快出完. 大概是应该尽量出当前能出出去最多的吧. 于是我们选择优先出顺子. 这样做有什么好处呢? 我们会 ...
- 半透明全屏蒙层+全屏屏蔽+内容居中+css
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 蓝绿部署、红黑部署、AB测试、灰度发布、金丝雀发布、滚动发布的概念与区别(转)
出处:https://www.baidu.com/link?url=QjboallwNm_jxcL3fHG57wEakiBfAs_3-TChTGu1eBXstlHEsGBc-NDA7AKTqsiroB ...
- Educational Codeforces Round 54 E. Vasya and a Tree(树上差分数组)
https://codeforces.com/contest/1076/problem/E 题意 给一棵树(n<=3e5),m(3e5)次查询,每次查询u,d,x,表示在u的子树中,给距离u&l ...
- 将excel中的数据填入word模板中-VBA
首先将word模板中需要填写excel中数据的空白处用自己独特的字符串标记,比如 数据001 什么的.如下图: 这样,就可以用vba搜寻这些自己独特的标记来根据excel内容填充word了. 第 ...
- python3.4对已经存在的excel写入数据
#!/usr/bin/env python # -*- coding:utf-8 -*- # __author__ = "blzhu" """ pyt ...
- SpringBoot初探
一:项目创建 个人用的是IDEA来做Demo的: 1.先创建一个空项目,然后创建一个基于Maven的java application项目: 2.创建好后配置pom.xml文件并最终reimport & ...
- JS、JSP、ASP、CGI
1)JS是在客户端执行的,需要浏览器支持Javascript.JSP是在服务器端执行的,需要服务器上部署支持Servlet的服务器程序.JS代码是能够直接从服务器上download得到,对外是可见 ...
- PHP后台评论 接口
/** * 添加评论 * content 评论内容 * addtime 评论时间 * uid 评论作品 */ public function padd(){ $param=input('param.' ...