sof*_*ved 1 iphone automation background uiapplicationdelegate cocoa-design-patterns
我发布了这个问题(连同答案),以便其他人可以从一个简洁的技术中受益,我已经发展到让模块自动检测(和响应)iOS应用程序状态更改.(格式化)博客讨论在这里我的博客
sof*_*ved 12
如果您想要解决让代码执行以响应应用程序状态更改的问题,那么您将找到代码示例,其中您将代码调用添加到应用程序委托中,因为只要应用程序执行了didFinishLaunchingWithOptions或didBecomeActive或WillEnterBackground就会调用它. .
但是,假设您开始使用另一个应用程序,它会重复使用您的大量代码.如果您只是复制一些文件并获得所有功能,而不必担心重新连接应用程序委托方法,那不是很好吗?
总而言之,我们希望插入式模块只需通过项目中的工作即可完成工作,无需任何额外的工作或连线.在这一点上,你可能会说"我也想让独角兽和精灵给我带来披萨".忍受我.
我不确定在阅读文档时我是如何错过这一点的,但是当iOS应用程序改变状态时,不仅仅是知道它的应用程序委托.NSNotifications也会针对所有主要州的变化发布.这是直接从api参考文本中获取的文本:
在调用[applicationDidBecomeActive]之后,应用程序还发布了UIApplicationDidBecomeActiveNotification通知,以便为感兴趣的对象提供响应转换的机会.
类似地,有一个UIApplicationDidFinishLaunchingNotification在应用程序完成启动后立即发布,以及其他用于进入后台或进入前台的通知.
所以这简化了我们的代码:而不是必须调用
[RobustWebService handleAppBecomingActive]
Run Code Online (Sandbox Code Playgroud)
在app delegate的applicationDidBecomeActive实现中,我们只需要让RobustWebService响应UIApplicationDidFinishLaunchingNotification.
现在考虑一下,您可能会意识到,为了让RWS类处理通知,它必须注册为观察者.那个电话看起来像
[[NSNotificationCenter defaultCenter] addObserver:self
Selector:@selector(handleAppBecomeActive)
name:UIApplicationDidFinishLaunchingNotification
object :nil]
Run Code Online (Sandbox Code Playgroud)
那可以在哪里完成?请记住,我们不想触摸应用程序委托,因为这会破坏拥有自包含插入模块的意图.如果只有某种方法让addObserver函数调用自动发生在类中.要是…
在这一点上,我们不得不退出"Cocoa"并深入研究Objective-C的基础技术.果然,有一个类方法,称为"加载",如果在类定义中存在,它将在首次加载类时自动调用.让我们在代码中重申一下.如果在任何class.m文件中编写此函数
+ (void) load
{
// stuff
}
Run Code Online (Sandbox Code Playgroud)
它将在iOS加载类时运行.有趣的是,它在你的应用程序的main()例程被调用之前运行,所以你必须非常小心你尝试做什么!此时您的大多数应用程序实际上并未运行,但您可以保证您的类链接的所有框架都将首先加载.像NSNotificationCenter这样的框架,所以如果你在class.m中包含它
+ (void) load
{
[[NSNotificationCenter defaultCenter] addObserver:self
Selector:@selector(handleAppBecomeActive)
name:UIApplicationDidFinishLaunchingNotification
object :nil];
}
Run Code Online (Sandbox Code Playgroud)
然后,当您的应用程序变为活动状态时,将调用handleAppBecomeActive方法,而不必在项目中包含class.h和class.m之外执行任何操作.
如果您在class.m文件中包含此代码
+ (void) load;
{
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleAppLaunched)
name:UIApplicationDidFinishLaunchingNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleAppResigningActive) name:UIApplicationWillResignActiveNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleAppBecomingActive) name:UIApplicationDidBecomeActiveNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleAppEnteringBackground) name:UIApplicationDidEnterBackgroundNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleAppEnteringForeground) name:UIApplicationWillEnterForegroundNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleAppClosing) name:UIApplicationWillTerminateNotification object:nil];
}
Run Code Online (Sandbox Code Playgroud)
您的课程将收到所有应用程序状态更改的通知,无需其他工作.这太酷了,它仍然让我觉得很刺激.请享用!
特里
| 归档时间: |
|
| 查看次数: |
4520 次 |
| 最近记录: |