在launchOptionsLocation密钥发现上最小化didFinishLaunchingWithOptions进程?

时间:2012-04-01 17:06:23

标签: ios ios5 cllocationmanager uiapplicationdelegate

我在我的应用程序中新实现了位置处理,在前台和后台测试并获得了满意的结果。该应用程序正在监控重要的位置变化以及多个区域。我还没弄清楚当应用程序被暂停或终止时是否会得到相同的结果。 根据我的理解,当应用程序从这些状态唤醒时,应用程序刚刚启动,除了launchOptionsLocation键将在launchOptions字典参数中找到。我的问题是,我是否可以允许应用程序代理正常进行并假设一切正常?是否有必要拦截所有视图设置代码?

我的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中的位置键并跳过方法的其余部分,但我不确定可能带来哪些不可预见的并发症。 我还质疑,如果用户在没有设置任何视图的完整状态下故意启动应用程序,会导致什么结果。

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

---其他更新信息----

在携带测试电话的一天进行初步测试,我的位置处理似乎完成了我想要的所有任务,而没有更改appDelegate。因此我假设从暂停/术语唤醒并执行完整的appDelegate过程,即使没有视图控制器变得可见。 因此,虽然似乎不需要改变启动程序,但是仍然可能存在性能或电池问题,这会使得谨慎地缩短appDelegate程序并最小化处理?

1 个答案:

答案 0 :(得分:1)

经过一番测试和调整后,我发现:

  1. 应用程序将从无效状态唤醒或无任何问题。
  2. 无论App Delegate的更改如何,我的位置方法都会运行并完成。
  3. 当我将应用委托流程缩短时,我确实遇到了预期的间歇性启动问题。
  4. 即使没有明显的性能优势,我继续分离出视图设置代码并添加了一个标志,这样除非应用程序在前台显示,否则它不会运行。只运行不需要的处理似乎是正确的。 我最终得到的代码是:

    // 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; 
    }
    

    然后你有了设置视图:

    -(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]; 
            }
    }
    

    注意:我的应用程序没有在后台运行位置服务,只是监听重要的位置更改和地理位置。