你的位置:首页 > 软件开发 > 操作系统 > iOS通知中心升级!

iOS通知中心升级!

发布时间:2016-04-11 17:00:03
简单介绍下,这是需求驱动中发现iOS的NotificationCenter有很多功能无法实现,于是对其进行了一层包装。相当于手动管理观察者栈和监听者期望执行的事件,因此可以为其添加了很多新增的功能,将其命名为MessageTransfer。一.核心优点1.高度解耦生命周期与页面实 ...

iOS通知中心升级!

简单介绍下,这是需求驱动中发现iOS的NotificationCenter有很多功能无法实现,于是对其进行了一层包装。相当于手动管理观察者栈和监听者期望执行的事件,因此可以为其添加了很多新增的功能,将其命名为MessageTransfer。

一.核心优点

1.高度解耦

  • 生命周期与页面实例周期相隔离
  • 可实现跨组件间通讯
  • 业务无关,内部只关心block代码执行

2.灵活定制

  • 每一条信息在发送的时候可以设置同步或异步执行
  • 支持消息的内部处理操作,内部处理操作后将结果返回
  • 一个消息有多个接收者时可以通过优先级排序执行。(同步情况下)
  • 同一个消息同一个实例可以实现多个block,并且可以是普通block+处理block

3.使用简便

  • 接口清晰符合逻辑设定,block挂在一起,代码聚合式管理
  • 内部实现一些连带操作,使用时或修改时都只用修改一处,以前则需要需求一变改多处
  • 严格把控循环引用无法释放等情况,内部实现了观察者delloc时的移除

 

二.API设计

1.以前的API使用

// ********普通做法  // 1.一边发送 (这个通知的名字命名还需要注意统一)[[NSNotificationCenter defaultCenter]postNotificationName:@"XXX" object:XXX userInfo:XXX];// 2.另一边接收[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(xxx:) name:@"XXX" object:XXX]// 3.还要手动去实现一个方法XXX:// 4.在自己方法的delloc时还要记得将观察者移除,否则会导致崩溃。delloc: [NSNotificationCenter defaultCenter]removeObserver

大概的实现了一个登录逻辑,发送的消息中的object带上了登录信息,负责登录的类接收到了消息之后对参数进行了判断或其他处理将结果返回,这个block的返回值会作为发送者block的入参。也就是说发送登录信息的类在这个消息的block中就能够拿到登录结果。 这些都是以往的消息中心所不能做到的。

 

五.源码片段

#pragma mark -#pragma mark listen recieved- (void)workingOnReceived:(NSNotification *)object{  NSString *name = object.name;    SXMessageExcuteType excuteType = [[self.msgExcuteType objectForKey:name]integerValue];    NSArray *observerArray = [self.msgObserversStack valueForKey:name];  if (excuteType == SXMessageExcuteTypeSync) {    NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"_priority" ascending:NO];    observerArray = [observerArray sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];  }    for (SXMessageObserver *obs in observerArray) {    NSArray *voidBlocks = [self.blockReceivedVoidStack valueForKey:obs.msgName];    NSArray *returnBlocks = [self.blockReceivedReturnStack valueForKey:obs.msgName];        if(voidBlocks && (voidBlocks.count > 0)){      for (id voidBlock in voidBlocks) {        if (excuteType == SXMessageExcuteTypeSync){          [self excuteWithVoidBlockDict:@{@"obs":obs,@"object":object,@"block":voidBlock}];        }else if (excuteType == SXMessageExcuteTypeAsync){          NSInvocationOperation *operation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(excuteWithVoidBlockDict:) object:@{@"obs":obs,@"object":object,@"block":voidBlock}];          [self.msgQueue addOperation:operation];        }      }    }        if (returnBlocks && (returnBlocks.count >0)){      for (id returnBlock in returnBlocks) {        if (excuteType == SXMessageExcuteTypeSync){          [self excuteWithReturnBlockDict:@{@"obs":obs,@"object":object,@"block":returnBlock}];        }else if (excuteType == SXMessageExcuteTypeAsync){          NSInvocationOperation *operation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(excuteWithReturnBlockDict:) object:@{@"obs":obs,@"object":object,@"block":returnBlock}];          [self.msgQueue addOperation:operation];        }      }    }    if(returnBlocks.count + voidBlocks.count < 1){#if TEST || DEBUG      NSString *errormsg = [NSString stringWithFormat:@"dsxWARNING! this msg <%@> not binding Recieved block",obs.msgName];      NSLog(@"%@",errormsg);#endif    }  }}

原标题:iOS通知中心升级!

关键词:IOS

IOS
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。