简化通知中心的使用

说明

1. 简化通知中心,笔者曾经实现过不需要移除的通知中心,基于弱引用集合(相对于强引用集合如NSArray,NSDictionary等)编写,本例子并无太多新意

2. 简化的通知中心由一个对象组织控制,不需要你手动移除被监听的对象,这是唯一的一点点有新意的地方

3. 在处理接收通知对象的地方,笔者提供了一个方法来简化取值操作,相对应的,发送通知消息的时候,被发送的对象也请使用指定的格式(都是用weak修饰,无需担心被持有)

源码

https://github.com/YouXianMing/NotificationCenter

//
//  NotificationCenterObject.h
//  NotificationCenter
//
//  Created by YouXianMing on 15/7/15.
//  Copyright (c) 2015年 YouXianMing. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface PostObject : NSObject

@property (nonatomic, strong) NSString *flag;
@property (nonatomic, weak)   id        data;

/**
 *  便利构造器初始化对象
 *
 *  @param flag 识别标签
 *  @param data 数据
 *
 *  @return 实例对象
 */
+ (instancetype)postObjectWithFlag:(NSString *)flag data:(id)data;

/**
 *  处理通知中心事件
 *
 *  @param sender 通知中心的通知对象
 *
 *  @return 实例对象
 */
+ (instancetype)accessNotificationCenterObject:(id)sender;

@end

///////////////////////////////////////////////////////////////////////////////////////////

@interface NotificationCenterObject : NSObject

/**
 *  === 必须先使用此方法进行初始化 ===
 *
 *  初始化通知中心
 *
 *  @param observer 观察对象
 *  @param name     注册标签
 *  @param selector 执行用selector
 *
 *  @return 实例对象
 */
+ (instancetype)withObserver:(id)observer
                registerName:(NSString *)name
                    selector:(SEL)selector;

/**
 *  给指定注册标签发信息
 *
 *  @param name     注册标签
 *  @param postData 发送的对象
 */
+ (void)postToRegisterName:(NSString *)name data:(PostObject *)postData;

@property (nonatomic, readonly, strong) NSString *name;
@property (nonatomic, readonly, weak)   id        observer;

/**
 *  移除
 */
- (void)remove;

/**
 *  重新添加上
 */
- (void)reAdd;

@end

///////////////////////////////////////////////////////////////////////////////////////////

/**
 *  创建通知对象
 *
 *  @param flag 标签
 *  @param data 传递的数据
 *
 *  @return 通知对象
 */
static inline PostObject * POST_OBJECT(NSString *flag, id data) {

    return [PostObject postObjectWithFlag:flag data:data];
}

/**
 *  处理通知的对象
 *
 *  @param sender 接收的通知对象
 *
 *  @return 通知对象
 */
static inline PostObject * ACCESS_POST_OBJECT(id sender) {

    return [PostObject accessNotificationCenterObject:sender];
}

/**
 *  发送通知消息
 *
 *  @param name       指定的标签
 *  @param postObject 通知的对象
 *
 */
static inline void POST_MSG_TO(NSString *name, PostObject *postObject) {

    [NotificationCenterObject postToRegisterName:name data:postObject];
}

/**
 *  注册通知中心
 *
 *  @param name     指定的标签
 *  @param observer 被注册的对象
 *  @param selector 执行的句柄
 *
 *  @return 实例对象
 */
static inline NotificationCenterObject * REGISTER_MSG_CENTER_WITH(NSString *name, id observer, SEL selector) {

    return [NotificationCenterObject withObserver:observer registerName:name selector:selector];
}
//
//  NotificationCenterObject.m
//  NotificationCenter
//
//  Created by YouXianMing on 15/7/15.
//  Copyright (c) 2015年 YouXianMing. All rights reserved.
//

#import "NotificationCenterObject.h"

@implementation PostObject

+ (instancetype)postObjectWithFlag:(NSString *)flag data:(id)data {

    PostObject *postObject = [PostObject new];
    postObject.flag        = flag;
    postObject.data        = data;

    return postObject;
}

+ (instancetype)accessNotificationCenterObject:(id)sender {

    PostObject *postData = nil;

    if ([sender isKindOfClass:[NSNotification class]]) {

        NSNotification *notiData = sender;

        if ([notiData.object isKindOfClass:[PostObject class]]) {

            postData = notiData.object;
        }
    }

    return postData;
}

@end

@interface NotificationCenterObject ()

@property (nonatomic, strong) NSString *name;
@property (nonatomic, weak)   id        observer;
@property (nonatomic)         SEL       observerSelector;

@property (nonatomic)         BOOL      haveAddObserver;

@end

@implementation NotificationCenterObject

+ (void)postToRegisterName:(NSString *)name data:(PostObject *)postData {

    [[NSNotificationCenter defaultCenter] postNotificationName:name object:postData];
}

+ (instancetype)withObserver:(id)observer registerName:(NSString *)name selector:(SEL)selector {

    NotificationCenterObject *notificationCenterObject = [NotificationCenterObject new];
    notificationCenterObject.name                      = name;
    notificationCenterObject.observer                  = observer;
    notificationCenterObject.observerSelector          = selector;

    notificationCenterObject.haveAddObserver           = YES;
    [[NSNotificationCenter defaultCenter] addObserver:observer selector:selector name:name object:nil];

    return notificationCenterObject;
}

- (void)remove {

    if (self.haveAddObserver == YES && _name && _observer) {
        self.haveAddObserver = NO;
        [[NSNotificationCenter defaultCenter] removeObserver:_observer name:_name object:nil];
    }
}

- (void)reAdd {

    if (self.haveAddObserver == NO && _name && _observer) {
        self.haveAddObserver = YES;
        [[NSNotificationCenter defaultCenter] addObserver:_observer selector:_observerSelector name:_name object:nil];
    }
}

- (void)dealloc {

    if (self.haveAddObserver == YES) {

        NSLog(@"已经释放");
        [[NSNotificationCenter defaultCenter] removeObserver:_observer name:_name object:nil];
    }
}

@end

细节

用内联函数将OC风格函数简化为C风格函数,能够稍微缩短代码编写长度,其实并无实用价值,装的成分居多。

时间: 2024-10-17 23:04:32

简化通知中心的使用的相关文章

Notification Centers 通知中心

Notification Centers 通知中心 A notification center manages the sending and receiving of notifications. It notifies all observers of notifications meeting specific criteria. The notification information is encapsulated in NSNotification objects. Client o

通知中心 - NSNotificationCenter

---恢复内容开始--- NS_ASSUME_NONNULL_BEGIN /**************** Notifications ****************/ // 通知,被发送,被接受. @interface NSNotification : NSObject <NSCopying, NSCoding> 通知的名字 @property (readonly, copy) NSString *name; 具体某一个对象. @property (nullable, readonly,

第二十六篇:通知中心 NSNotificationCenter

1.通知中心(NSNotificationCenter) ?每一个应用程序都有一个通知中心(NSNotificationCenter)实例,专门负责协助不同对象之间的消息通信 ?任何一个对象都可以向通知中心发布通知(NSNotification),描述自己在做什么.其他感兴趣的对象(Observer)可以申请在某个特定通知发布时(或在某个特定的对象发布通知时)收到这个通知 2.通知(NSNotification) >一个完整的通知一般包含3个属性: - (NSString*)name; // 通

iOS之NSNotificationCenter通知中心使用事项

其实这里的通知和之前说到的KVO功能很想,也是用于监听操作的,但是和KVO不同的是,KVO只用来监听属性值的变化,这个发送监听的操作是系统控制的,我们控制不了,我们只能控制监听操作,类似于Android中系统发送的广播,我们只能接受.但是通知就不一样了,他的监听发送也是又我们自己控制,我们可以在任何地方任何时机发送一个通知,类似于Android中开发者自己发送的广播.从这一点看来,通知的使用场景更为广泛了. 下面就来看一下例子: 还是护士和小孩的那个例子 Children.h [objc] vi

iOS开发中的错误整理,再一次整理通过通知中心来处理键盘,一定记得最后关闭通知中心

一.打开通知中心,监听键盘的显示与隐藏 二.最后记得将监听通知的对象移除

通知中心(NSNotificationCenter)

•通知机制 •掌握 •通知的发布 • •通知的监听 • •通知的移除 •通知中心(NSNotificationCenter) •每一个应用程序都有一个通知中心(NSNotificationCenter)实例,专门负责协助不同对象之间的消息通信 •任何一个对象都可以向通知中心发布通知(NSNotification),描述自己在做什么.其他感兴趣的对象(Observer)可以申请在某个特定通知发布时(或在某个特定的对象发布通知时)收到这个通知 •通知(NSNotification) •一个完整的通知

iOS通知中心 NSNotificationCenter详解

NSNotificationCenter的适用场景,原理机制,使用步骤等. 通知中心的使用顺序:先确保注册了观察者,因为发送通知是一瞬间的事,如果没有注册观察者,发送通知后再注册是不会收到的. 总结:通知只会发送给当前监听着的对象. 代码 //注册通知  在关心该通知的页面注册监听 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tongzhi:) name:@"tongzhi" obj

KVO 通知中心

1. KVO观察者模式. 给某个实例变量注册一个观察者. 其中 Model为定义的模型  ICBCPrice为模型的实例变量.  options的两个值分别是 新值和旧值   context 可以起到表示作用. [_Model addObserver:self forKeyPath:@"ICBCPrice" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil]; 实施监听, 如果

通知中心 NSNotificationCenter 的简单使用方法

NSNotificationCenter(通知中心)   [注意]需再dealloc中移除观察者   获取通知中心单例对象 NSNotificationCenter *center=[NSNotificationCenter defaultCenter]; 常用方法: 1.注册观察者 - (void)addObserver:(id)observer selector:(SEL)aSelector name:(NSString *)aName object:(id)anObject; 参数: ob