不用自动移除的通知中心

源码

//
//  DefaultNotificationCenter.h
//  TotalCustomTabBarController
//
//  Created by YouXianMing on 16/6/3.
//  Copyright © 2016年 YouXianMing. All rights reserved.
//

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

@protocol DefaultNotificationCenterDelegate <NSObject>

@required

/**
 *  DefaultNotificationCenter‘s event.
 *
 *  @param notification DefaultNotificationCenter object.
 *  @param name         Event name.
 *  @param object       Event object, maybe nil.
 */
- (void)defaultNotificationCenter:(DefaultNotificationCenter *)notification name:(NSString *)name object:(id)object;

@end

@interface DefaultNotificationCenter : NSObject

/**
 *  Post event to notification name.
 *
 *  @param name   Notification name.
 *  @param object Data.
 */
+ (void)postEventToNotificationName:(NSString *)name object:(id)object;

/**
 *  DefaultNotificationCenter‘s delegate.
 */
@property (nonatomic, weak) id <DefaultNotificationCenterDelegate>  delegate;

/**
 *  Add notification name.
 *
 *  @param name Notification name.
 */
- (void)addNotificationName:(NSString *)name;

/**
 *  Delete notification name.
 *
 *  @param name Notification name.
 */
- (void)deleteNotificationName:(NSString *)name;

/**
 *  Get all the notification names.
 *
 *  @return Notification names‘s array.
 */
- (NSArray <NSString *> *)notificationNames;

/**
 *  Remove all notifications.
 */
- (void)removeAllNotifications;

@end
//
//  DefaultNotificationCenter.m
//  TotalCustomTabBarController
//
//  Created by YouXianMing on 16/6/3.
//  Copyright © 2016年 YouXianMing. All rights reserved.
//

#import "DefaultNotificationCenter.h"

@interface DefaultNotificationCenterModel : NSObject

@property (nonatomic, strong) NSString *name;
@property (nonatomic)         BOOL      effective;

@end

@implementation DefaultNotificationCenterModel

@end

@interface DefaultNotificationCenter ()

@property (nonatomic, strong) NSMutableArray <DefaultNotificationCenterModel *> *stringsArray;

@end

@implementation DefaultNotificationCenter

- (instancetype)init {

    if (self = [super init]) {

        self.stringsArray = [NSMutableArray array];
    }

    return self;
}

+ (void)postEventToNotificationName:(NSString *)name object:(id)object {

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

- (void)addNotificationName:(NSString *)name {

    // Check have the same name or not.
    __block BOOL haveTheSameName = NO;

    [self.stringsArray enumerateObjectsUsingBlock:^(DefaultNotificationCenterModel * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {

        if ([obj.name isEqualToString:name]) {

            haveTheSameName = YES;
            *stop           = YES;
        }
    }];

    // Add notification.
    if (haveTheSameName == NO) {

        DefaultNotificationCenterModel *model = [DefaultNotificationCenterModel new];
        model.name                            = name;
        model.effective                       = YES;
        [self.stringsArray addObject:model];

        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notificationEvent:) name:model.name object:nil];
    }
}

- (void)deleteNotificationName:(NSString *)name {

    // Check have the same name or not.
    __block BOOL      haveTheSameName = NO;
    __block NSInteger index           = 0;

    [self.stringsArray enumerateObjectsUsingBlock:^(DefaultNotificationCenterModel * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {

        if ([obj.name isEqualToString:name]) {

            haveTheSameName = YES;
            index           = idx;
            *stop           = YES;
        }
    }];

    // Remove notification.
    if (haveTheSameName == YES) {

        DefaultNotificationCenterModel *model = self.stringsArray[index];
        [[NSNotificationCenter defaultCenter] removeObserver:self name:model.name object:nil];
        [self.stringsArray removeObject:model];
    }
}

- (NSArray <NSString *> *)notificationNames {

    NSMutableArray *namesArray = [NSMutableArray array];
    [self.stringsArray enumerateObjectsUsingBlock:^(DefaultNotificationCenterModel * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {

        [namesArray addObject:obj.name];
    }];

    return [NSArray arrayWithArray:namesArray];
}

- (void)removeAllNotifications {

    [self.stringsArray enumerateObjectsUsingBlock:^(DefaultNotificationCenterModel * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {

        [[NSNotificationCenter defaultCenter] removeObserver:self name:obj.name object:nil];
    }];

    [self.stringsArray removeAllObjects];
}

- (void)notificationEvent:(id)obj {

    NSNotification *notification = obj;

    if (self.delegate && [self.delegate respondsToSelector:@selector(defaultNotificationCenter:name:object:)]) {

        [self.delegate defaultNotificationCenter:self name:notification.name object:notification.object];
    }
}

- (void)dealloc {

    [self removeAllNotifications];
}

@end

细节

1. 将通知的接收转换成了代理,根据代理中的一个通知名字值来区分不同的通知.

2. 不用自动移除注册的通知

3. 用这个方法发送通知

时间: 2024-10-03 14:47:08

不用自动移除的通知中心的相关文章

通知中心和通知

1.首先通知中心和通知是两码事. 通知中心是一个类---NSNotificationCenter,通知是另一个类---NSNotification. NSNotification是对一个通知的描述,即一个通知应该包括哪些信息.哪些行为. 通知有三个属性 @property (readonly, copy) NSString *name;通知的名字.(放假通知) @property (nullable, readonly, retain) id object;通知的发布者.(班主任) @prope

简化通知中心的使用

说明 1. 简化通知中心,笔者曾经实现过不需要移除的通知中心,基于弱引用集合(相对于强引用集合如NSArray,NSDictionary等)编写,本例子并无太多新意 2. 简化的通知中心由一个对象组织控制,不需要你手动移除被监听的对象,这是唯一的一点点有新意的地方 3. 在处理接收通知对象的地方,笔者提供了一个方法来简化取值操作,相对应的,发送通知消息的时候,被发送的对象也请使用指定的格式(都是用weak修饰,无需担心被持有) 源码 https://github.com/YouXianMing/

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 的简单使用方法

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

重写通知中心类

笔者重新设计了通知中心类,功能完全与系统的通知中心一致,但有着比系统通知中心更优秀的地方: 1. 注册了通知中心不需要手动移除,如果注册对象自动释放了,在通知中心中注册的信息也会自动消失 2. 传递的参数可以是任何的对象,包括数组,字典等等一切对象 3. 基于NSObject的category扩展而来,使用非常的方便 所有的源码如下: CustumNotification.h // // CustumNotification.h // // http://home.cnblogs.com/u/Y

QF——iOS消息机制(通知中心)

前面我们讲iOS不同界面间传值的时候,说过可以通过通知中心进行传值.那到底什么是通知中心,他是如何实现传值的呢? NSNotificationCenter是单例的,只提供了一个唯一的实例化入口,在整个应用内只存在一个实例 :     [NSNotificationCenter defaultCenter] 只要“关注”NSNotificationCenter的实例,就可以自动接收其他对象通过通知中心发的消息.因为它的关注者可以有很多个,所以它也就有了广播性质. 在通知中心里,消息发送者和接收者一

通知中心 - NSNotificationCenter

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

iOS之NSNotificationCenter通知中心使用事项

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

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

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