测试测试过 | ✗ |
Lang语言 | Obj-CObjective C |
许可协议 | WTFPL |
发布最后发布 | 2014 年 12 月 |
由 未申明的 维护。
SEStatefulNotificationsRobot 是 NSNotification
的包装,简化了对可观测对象的基于 enum
(或少量类型转换,BOOL
)的基于状态的变更的跟踪和响应。
最好的解释是通过一个例子。
假设您有一些长期运行的过程--例如,您正在通过 HTTP 请求加载一组图像。这些图像必须在一个您即将推送的 UIViewController
中可用。在这些图像可用之前,您需要禁用视图上的所有按钮。
通常,您可能会在视图控制器的 -viewWillAppear:
方法中编写一些代码来检查 HTTP 请求是否已完成。您可能设置一个通知观察者 + 处理程序。您也可能编写一些代码,如果在该点 HTTP 请求尚未完成,启用按钮,如果它们已启用:您将一些代码...
这并不那么糟糕,但这仅仅是因为我太懒,以至于不愿意用更复杂的情况来说明情况开始失控。
但是它们会的,而且会很快。例如,假设您只能在将一些任务分配给某些 UIView 组件的其他后台线程完成之后初始化其中的一些组件呢?一旦它被初始化,它还应该监视原始 HTTP 请求以确定其当前状态,好吗?好吧,再次执行所有检查...添加更多的状态标志...等等。
您可能会决定编写一个巨大的 "检查" 方法,该方法遍历所有控件,并在 HTTP 请求(以及您控件所依赖的其他任何长时间运行过程)更改状态时启用/禁用/重新着色等。但是,然后您可能会发送很多不必要的消息,包括有时向 nil
发送大量消息,尤其是如果您从 viewDidLoad
或 viewWillAppear
调用 "检查" 方法。
就性能而言,这并不是世界的末日,但肯定会导致代码杂乱无章。
如果你处于这样的情况,你有很多不同的观察者正在观察许多不同进程的状态,并且它们都应该以相对复杂的方式对这些状态做出相互依赖和交叉连接的响应,但你还要求易于阅读、易于维护且能够抵抗变成绝对混乱的代码,那么你可能要考虑使用 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
参数。
请您随意使用公共许可证版本 2,2004 年 12 月
版权所有 (C) 2004 山姆·欧赛瓦尔 <[email protected]>
每个人都被允许以原始或修改后的形式复制和分发此许可文档,并且更改它也是允许的,只要更改名称。
请您随意使用公共许可证复制、分发和修改条款条件