Свернуть ли didFinishLaunchingWithOptions процессы при открытии ключа launchOptionsLocation? - PullRequest
1 голос
/ 01 апреля 2012

В моем приложении реализована обработка местоположения, тестирование на переднем и заднем плане с удовлетворительными результатами.Приложение отслеживает значительные изменения местоположения, а также несколько регионов.Я еще не выяснил, получу ли я такие же результаты, когда приложение будет приостановлено или завершено.Насколько я понимаю, когда приложение пробуждается из этих состояний, оно будет выглядеть так, как будто приложение только что запустилось, за исключением того, что ключ 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 и пропустить весь остаток метода, хотя я не уверен, какие непредвиденные осложнения могут повлечь за собой.Я также спрашиваю себя, что произойдет, если пользователь случайно запустит приложение, когда оно находилось в этом незавершенном состоянии и не настроил представления вообще.

Является ли это тем, что было опробовано, необходимо ли это даже привсе?Я не вижу, как это проверить, так как не знаю способа оставаться на связи с отладчиком Xcode, когда приложение приостановлено.

--- Дополнительная обновленная информация ----

При первоначальном тестировании в день переноса тестового телефона обработка моего местоположения, казалось, выполняла все задачи, которые я хотел, без изменений в appDelegate.Итак, я предполагаю, что пробуждение от приостановки / термина подошло и выполнило полную процедуру appDelegate, даже если никакие контроллеры представления никогда не становились видимыми.Таким образом, хотя кажется, что не требуется изменять процедуры запуска, может ли сохраняться проблема производительности или заряда батареи, которая сделала бы целесообразным сократить процедуру appDelegate и свести к минимуму обработку?

1 Ответ

1 голос
/ 04 апреля 2012

После длительного тестирования и настройки я нахожу:

  1. Приложение выйдет из неактивного состояния или будет без проблем.
  2. Мои методы определения местоположения выполнялись и выполнялись независимо от изменений в делегате приложения.
  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]; 
        }
}

Примечание. Мое приложение не запускает службы определения местоположения в фоновом режиме, а только прослушивает значительные изменения местоположения и геозону.

...