ObjC-StatelyNotificationRobot 0.0.1

ObjC-StatelyNotificationRobot 0.0.1

测试测试过
Lang语言 Obj-CObjective C
许可协议 WTFPL
发布最后发布2014 年 12 月

未申明的 维护。



  • 作者
  • bryn austin bellomy

// 状态通知机器人

是什么

SEStatefulNotificationsRobotNSNotification 的包装,简化了对可观测对象的基于 enum(或少量类型转换,BOOL)的基于状态的变更的跟踪和响应。

哦,这是什么意思

最好的解释是通过一个例子。

长期运行过程 ...

假设您有一些长期运行的过程--例如,您正在通过 HTTP 请求加载一组图像。这些图像必须在一个您即将推送的 UIViewController 中可用。在这些图像可用之前,您需要禁用视图上的所有按钮。

... + 非平凡的观察者代码 ...

通常,您可能会在视图控制器的 -viewWillAppear: 方法中编写一些代码来检查 HTTP 请求是否已完成。您可能设置一个通知观察者 + 处理程序。您也可能编写一些代码,如果在该点 HTTP 请求尚未完成,启用按钮,如果它们已启用:您将一些代码...

... + 许多观察者 = NSNightmare

这并不那么糟糕,但这仅仅是因为我太懒,以至于不愿意用更复杂的情况来说明情况开始失控。

但是它们会的,而且会很快。例如,假设您只能在将一些任务分配给某些 UIView 组件的其他后台线程完成之后初始化其中的一些组件呢?一旦它被初始化,它还应该监视原始 HTTP 请求以确定其当前状态,好吗?好吧,再次执行所有检查...添加更多的状态标志...等等。

您可能会决定编写一个巨大的 "检查" 方法,该方法遍历所有控件,并在 HTTP 请求(以及您控件所依赖的其他任何长时间运行过程)更改状态时启用/禁用/重新着色等。但是,然后您可能会发送很多不必要的消息,包括有时向 nil 发送大量消息,尤其是如果您从 viewDidLoadviewWillAppear 调用 "检查" 方法。

就性能而言,这并不是世界的末日,但肯定会导致代码杂乱无章。

前一段落的摘要

如果你处于这样的情况,你有很多不同的观察者正在观察许多不同进程的状态,并且它们都应该以相对复杂的方式对这些状态做出相互依赖和交叉连接的响应,但你还要求易于阅读、易于维护且能够抵抗变成绝对混乱的代码,那么你可能要考虑使用 SEStatelyNotificationRobot

好吧,行,你怎么使用它

有一个单例 SEStatelyNotificationRobot 实例名为 sharedRobot,你可以用来稍微简化你的代码。把它想象成 [NSNotificationCenter defaultCenter] 的一个堂兄弟。

注册状态观察者

只需这样注册你的状态观察者

[[SEStatelyNotificationRobot sharedRobot] handleStateOf: kMyHTTPRequest
                                              handlerID: kMyFirstButton
                                                onQueue: [NSOperationQueue mainQueue]
                                              withBlock: ^(SEState currentState, NSDictionary *stateInfo) {

                                                if (currentState == MyState_NotFinished) {
                                                  _firstButton.enabled = NO;
                                                }
                                                else if (currentState == MyState_Finished) {
                                                  _firstButton.enabled = YES;
                                                }

                                              }];

[[SEStatelyNotificationRobot sharedRobot] handleStateOf: kMyHTTPRequest
                                              handlerID: kMySecondButton
                                                onQueue: [NSOperationQueue mainQueue]
                                              withBlock: ^(SEState currentState, NSDictionary *stateInfo) {

                                                if (currentState == MyState_NotFinished) {
                                                  _secondButton.enabled = NO;
                                                }
                                                else if (currentState == MyState_Finished) {
                                                  _secondButton.enabled = YES;
                                                }

                                              }];

当你做出这些调用时,你的处理程序块将被调用并传递当前的 'stative thing' 类型的状态,即 kMyHTTPRequest。换句话说,通过在你的初始化代码中设置状态观察者,你的观察对象实际上会得到正确的初始化,并且被注册为观察者。不需要担心和维护的代码块又少了一个,只要你按照这个思路编写处理程序块。

改变状态(从而触发观察者的处理程序块)

[[SEStatelyNotificationRobot sharedRobot] changeStateOf: kMyHTTPRequest
                                                     to: MyState_Finished
                                              stateInfo: myStateInfoDictionary];

调用这个方法后,你的处理程序块会以新状态和传递的 stateInfo 字典调用。

请注意,如果你不需要它,可以省略 stateInfo 参数。

许可 (WTFPL v2)

请您随意使用公共许可证版本 2,2004 年 12 月

版权所有 (C) 2004 山姆·欧赛瓦尔 <[email protected]>

每个人都被允许以原始或修改后的形式复制和分发此许可文档,并且更改它也是允许的,只要更改名称。

请您随意使用公共许可证复制、分发和修改条款条件

  1. 你只需随意行事。