测试已测试 | ✗ |
语言语言 | Obj-CObjective C |
许可协议 | MIT |
发布上次发布 | 2015 年 10 月 |
由 Javier Soto 维护。
类 UIApplicationDelegate
将不同的职责分离到更多可重用的类中。
UIApplicationDelegate
可能是 UIKit 中最复杂的协议。一个遵守它的类不会只有一个单一的职责,因此违反了最重要的面向对象设计原则之一:强 单一职责原则 (SRP)
其结果是我们投入其中的所有代码基本上都不可重用。我们的 App Delegate 经常成为应用程序中 最紧密耦合的类,其中所编写的代码在另一个应用程序中难以重用。然而,我们编写的大量代码应该是可重用的:处理通知、状态恢复、打开 URL...理想情况下,我们应该 将每个职责提取到各自的类中。这正是 JSDecoupledAppDelegate
允许您实现的。
JSDecoupledAppDelegate
公开了一系列不同的协议,每个将实现其中一项职责的类都必须遵守
@protocol JSApplicationStateDelegate;
@protocol JSApplicationDefaultOrientationDelegate;
@protocol JSApplicationBackgroundFetchDelegate;
@protocol JSApplicationRemoteNotificationsDelegate;
@protocol JSApplicationLocalNotificationsDelegate;
@protocol JSApplicationStateRestorationDelegate;
@protocol JSApplicationURLResourceOpeningDelegate;
@protocol JSApplicationShortcutItemDelegate;
@protocol JSApplicationHealthDelegate;
@protocol JSApplicationProtectedDataDelegate;
@protocol JSApplicationWatchInteractionDelegate;
@protocol JSApplicationExtensionDelegate;
@protocol JSApplicationActivityContinuationDelegate;
JSDecoupledAppDelegate
有一个用于每个协议的属性,您必须使用符合它对象来设置。所有协议都是可选的,这意味着除非您想实现其中一个方法,否则您不需要提供对象。
请查看 JSDecoupledAppDelegate.h
了解每个协议具有哪些方法的更多详细信息。
注意:一些协议方法缺失,因为它们不是必需的:每当发送相应的 NSNotification
时(特别是如果方法不需要返回任何内容),最好实践是监听该通知,而不是实现该方法。这允许您在多个位置监听该通知,而不是在相同的方法中实现与该事件相关的所有逻辑,从而帮助您保持职责的分离。
首先,必须告诉 UIApplication
它应该实例化 JSDecoupledAppDelegate
类的一个实例。这通常在 int main()
方法中发生,在 main.m
文件中
return UIApplicationMain(argc, argv, nil, NSStringFromClass([JSDecoupledAppDelegate class]));
在这之后,您需要做的就是获取 App Delegate 的实例并开始设置一些属性。
在 JSDecoupledAppDelegate
中使用时唯一的注意事项是确保在将要调用其中一个方法之前设置了一些代理属性(例如,- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
)
实现这个功能的一种方法是向一个实现 JSDecoupledAppDelegate
协议的类中添加 +load
方法,并执行类似以下操作:
+ (void)load
{
[JSDecoupledAppDelegate sharedAppDelegate].appStateDelegate = [[self alloc] init];
}
因此,JSDecoupledAppDelegate
提供了一个 -sharedAppDelegate
方法,该方法返回它自己的单例实例。这是为了确保在 UIApplication
创建 App Delegate 之前调用此方法时,不会创建两个实例。另外,一个应用程序拥有多个 App Delegate 对象也没有意义。
有关此内容的更详细信息,请参阅本存储库中的示例应用程序。
只需将此行添加到您的 Podfile
:
pod 'JSDecoupledAppDelegate', '~> 1.1.0'
只需将 JSDecoupledAppDelegate.h
和 JSDecoupledAppDelegate.m
文件添加到您的项目即可。
JSDecoupledAppDelegate
与 iOS 5、iOS 6、iOS 7 和 iOS 8 兼容。
JSDecoupledAppDelegate
在 MIT 许可下可用。有关更多信息,请参阅 LICENSE 文件。