ios - 最小化 launchOptionsLocation key 发现上的 didFinishLaunchingWithOptions 进程?

标签 ios ios5 cllocationmanager uiapplicationdelegate

我在我的应用程序中新实现了位置处理,在前台和后台进行测试,结果令人满意。该应用程序正在监视重要的位置变化以及多个区域。我还没有弄清楚当应用程序暂停或终止时是否会得到相同的结果。 据我了解,当应用程序从这些状态中唤醒时,就像应用程序刚刚启动一样,除了 launchOptionsLocation 键将在 launchOptions Dictionary 参数中找到。我的问题是,我可以让应用程序委托(delegate)照常进行并假设一切都很好吗?是否需要拦截所有 View 设置代码?

我的 didFinishLaunchingWithOptions:launchOptions 方法的第一行是:

NSManagedObjectContext *context = [self managedObjectContext];
if (!context) {
    //Handle Error
}

self.sharedLocationHandler = [[[TTLocationHandler alloc] init] autorelease];
self.siteLogger = [[[ProjectSiteLogger alloc] initWithOptions:nil] autorelease];
self.siteLogger.locationHandler = self.sharedLocationHandler;
self.siteLogger.managedObjectContext = context;

很可能,这涵盖了我响应位置事件所需的所有内容。我可以轻松地测试 launchOptions 中的位置键并跳过该方法的整个剩余部分,但我不确定可能会带来哪些无法预料的复杂情况。 我还质疑如果用户碰巧在应用程序处于完全未设置 View 的不完整状态时有意启动该应用程序,结果会怎样。

这是已经尝试过的东西,甚至有必要吗?我不知道如何测试它,因为我不知道在应用程序暂停时保持与 Xcode 调试器连接的方法。

---附加更新信息----

在携带测试电话的那一天进行的初始测试,我的位置处理似乎完成了我想要的所有任务,而没有对 appDelegate 进行任何更改。所以我假设从挂起/任期唤醒出现并执行了完整的 appDelegate 过程,即使没有 View Controller 变得可见。 因此,虽然似乎不需要更改启动过程,但是否仍然存在性能或电池问题,这使得缩短 appDelegate 过程并尽量减少处理变得谨慎?

最佳答案

经过大量测试和调整后,我发现:

  1. 应用将从非事件状态或终止状态唤醒,没有任何问题。
  2. 无论 App Delegate 发生什么变化,我的定位方法都会运行并完成。
  3. 当我缩短应用程序委托(delegate)流程时,我确实遇到了预期的间歇性启动问题。

即使没有明显的性能优势,我还是继续分离 View 设置代码并添加一个标志,这样它就不会运行,除非应用程序出现在前台。运行不超过需要的处理似乎是正确的。 我最终得到的代码是:

// Initialize a flag
BOOL needsViewsSetup = YES;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
    // All my response to location events are handled in the these two classes
    self.sharedLocationHandler = [[[TTLocationHandler alloc] init] autorelease];
    self.siteLogger = [[[ProjectSiteLogger alloc] initWithOptions:nil] autorelease];
    self.siteLogger.locationHandler = self.sharedLocationHandler;
    self.siteLogger.managedObjectContext = self.managedObjectContext;

    // check launchOptions, skip all the views if there we were woken by location event
    if (![launchOptions objectForKey:UIApplicationLaunchOptionsLocationKey]) {
        [self confirmDataExistsAtStartup];
        [self setupTabbarWithViews];
    }

    return YES; 
}

然后你有 View 设置:

-(void)setupTabbarsWithViews 
{
    // Code to setup initial views here

    // ending with flag toggle to prevent repeat processing
    needsViewsSetup = NO;
}

并且在应用中会进入前台:

- (void)applicationWillEnterForeground:(UIApplication *)application
{
        if (needsViewsSetup) {
           [self setupTabbarWithViews]; 
        }
}

注意:我的应用程序没有在后台运行位置服务,仅监听重要的位置变化和地理围栏。

关于ios - 最小化 launchOptionsLocation key 发现上的 didFinishLaunchingWithOptions 进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9966352/

相关文章:

iphone - iOS - Interface Builder Outlet 未初始化

ios - 在 iOS 中展开 View

ios - 如何传递数据并在保存旧行的情况下向 TableView 添加一行

ios - 无法使用 OCMock stub [CLLocationManager AuthorizationStatus]

ios - 第三方开发人员在企业内发布的iOS应用

iOS:如何让我的 block 在不相互干扰的情况下执行?

ios - iOS 5 的 Twitter API 时间线信息

iphone - 比较日期

ios - 如何旋转 GMSMarker 以显示用户移动方向?

ios - 后台 UILocalNotification - iOS 9