【问题标题】:Minimize didFinishLaunchingWithOptions Processes on launchOptionsLocation key discovery?最小化 launchOptionsLocation 密钥发现时的 didFinishLaunchingWithOptions 进程?
【发布时间】:2012-04-01 17:06:23
【问题描述】:

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

我的 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 中测试 location 键并跳过该方法的整个其余部分,尽管我不确定可能会带来哪些不可预见的并发症。 我还质疑如果用户碰巧在应用程序处于未设置视图的不完整状态时故意启动应用程序会导致什么结果。

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

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

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

【问题讨论】:

    标签: ios ios5 cllocationmanager uiapplicationdelegate


    【解决方案1】:

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

    1. 该应用将从非活动状态唤醒或正常调用。
    2. 无论对 App Delegate 的更改如何,我的定位方法都会运行并完成。
    3. 当我缩短应用委托流程时,我确实遇到了预期的间歇性启动问题。

    尽管没有明显的性能优势,我还是继续分离了视图设置代码并添加了一个标志,以便除非应用程序出现在前台,否则它不会运行。只运行不需要的处理似乎是正确的。 我最终得到的代码是:

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

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

    【讨论】:

      猜你喜欢
      • 2011-11-04
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-01
      • 1970-01-01
      相关资源
      最近更新 更多