美文网首页
iOS中的设计模式

iOS中的设计模式

作者: 未来的路就在那 | 来源:发表于2018-08-20 14:00 被阅读39次

一,通知
自定义通知

#import "MyNotifacationCenter.h"
#import "MyNotifationModel.h"

@interface MyNotifacationCenter ()
@property (nonatomic ,strong) NSMutableDictionary *mutDic;
@end
@implementation MyNotifacationCenter

+ (MyNotifacationCenter *)shareNotifationCenter{
    static dispatch_once_t onceToken;
    static MyNotifacationCenter *single;
    dispatch_once(&onceToken, ^{
        single = [[self alloc]initSingle];
    });
    return single;
}

- (instancetype)initSingle{
    if ([super init]) {
        _mutDic = [NSMutableDictionary dictionary];
    }
    return self; 
}
- (void)addObserver:(id)observer selector:(SEL)aSelector name:(NSString *)aName object:(id )anObject{
    
    if (![_mutDic objectForKey:aName]) {
        NSMutableArray *arrys = [NSMutableArray array];
        MyNotifationModel *model = [[MyNotifationModel alloc]init];
        model.observer = observer;
        model.selector = aSelector;
        model.name = aName;
        model.object = anObject;
        [arrys addObject:model];
        [_mutDic setObject:arrys forKey:aName];
    }else{
        NSMutableArray *arrys = [_mutDic objectForKey:aName];
        MyNotifationModel *model = [[MyNotifationModel alloc]init];
        model.observer = observer;
        model.selector = aSelector;
        model.name = aName;
        model.object = anObject;
        [arrys addObject:model];   
    }
}
- (id <NSObject>)addObserverForName:(NSString *)name object:(id)obj queue:(NSOperationQueue *)queue usingBlock:(void (^)(MyNotifationModel *note))block
{
    //如果不存在,那么即创建
    if (![_mutDic objectForKey:name]) {
        // 创建数组模型
        NSMutableArray *arrys = [NSMutableArray array];
        MyNotifationModel *model = [[MyNotifationModel alloc]init];
        model.name = name;
        model.object = obj;
        model.operationQueue = queue;
        model.block = block;
        [arrys addObject:model];
        [_mutDic setObject:arrys forKey:name];
    }else{
        //如果存在,取出来,继续添加即可
        NSMutableArray *arrays = (NSMutableArray*)[_mutDic objectForKey:name];
        MyNotifationModel *model = [[MyNotifationModel alloc]init];
        model.name = name;
        model.object = obj;
        model.operationQueue = queue;
        model.block = block;
        [arrays addObject:model];
    }
    return nil;
}
- (void)postNotificationName:(NSString *)aname object:(id)anObject userInfo:(NSDictionary *)dic{
    NSMutableArray *arrys = [_mutDic objectForKey:aname];
    [arrys enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        MyNotifationModel *model  = (MyNotifationModel *)obj;
        id observer = model.observer;
        SEL selector = model.selector;
        NSString *name = model.name;
        id object = model.object;
        if (!model.operationQueue) {
            [observer performSelector:selector withObject:dic];
        }else{
            NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
                model.block(dic);
            }];
            [model.operationQueue addOperation:operation];
        }
        
    }];
}
- (void)removeObserver:(id)observer name:(NSString *)aName object:(nullable id)anObject{
    NSMutableArray *arrys = [_mutDic objectForKey:aName];
    [arrys enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        MyNotifationModel *model  = (MyNotifationModel *)obj;
        [arrys removeObject:model];
    }];
}
- (void)removeNotification:(id)observer{

}

#import <Foundation/Foundation.h>
typedef void (^OperationBlock)(id);
@interface MyNotifationModel : NSObject
@property (nonatomic ,weak) id observer;
@property (nonatomic ,copy)NSString *name;
@property (nonatomic ,assign)SEL selector;
@property (nonatomic ,weak) id object;
@property (nonatomic ,copy) OperationBlock block;
@property (nonatomic ,strong) NSOperationQueue *operationQueue;

@end

相关文章

网友评论

      本文标题:iOS中的设计模式

      本文链接:https://www.haomeiwen.com/subject/pixliftx.html