Как вызвать функцию в applicationDidEnterBackground? - PullRequest
2 голосов
/ 16 сентября 2011

Я хочу вызвать функцию в applicationDidEnterBackground эта функция определена в другом контроллере.

Я создал объект для доступа к нему, но кажется, что функция убивается при вызове.1005 * Вот функция, которая в основном рассчитывает расстояние и выдает уведомление

 -(void)calculateDistance
{

    for (NSMutableDictionary *obj in placeName) {
        CLLocation *userLocation = [[AppHelper appDelegate] mLatestLocation];
        CLLocation *annotation1 = [[CLLocation alloc] initWithLatitude:[[obj objectForKey:@"Lat"]doubleValue] longitude:[[obj objectForKey:@"long"]doubleValue]];

        CGFloat distanceTemp = [annotation1 getDistanceFrom:userLocation];

        [obj setObject:[NSNumber numberWithFloat:distanceTemp] forKey:@"distance"];
        [annotation1 release];
    }


    if ([placeName count])
    {
        NSArray *sortedArray=[placeName sortedArrayUsingFunction:intSort context:NULL];
        self.placeName = [NSMutableArray arrayWithArray:sortedArray];
        NSMutableArray *arrayTemp = [[NSMutableArray alloc] initWithArray:placeName];


        for (int i =0; i < [placeName count]; i++) 
        {
            //                  NSArray *sortedArray=[placeName sortedArrayUsingFunction:intSort context:NULL];

            NSMutableArray *tempArray = [sortedArray objectAtIndex:i];
            //DLog(@"sortedArray%@", sortedArray);8=
            NSNumber *DistanceNum = [tempArray objectForKey:@"distance"];
            NSLog(@"distance%@:::",DistanceNum);
            NSInteger intDistance = (int)[DistanceNum floatValue];

            if(intDistance<500)
            {
                NSLog(@"ho gaya bhai");
                NSString *notifications =@"Yes";
                [[AppHelper mDataManager] setObject:notifications forKey:@"notifications"]; 

                NSLog(@"notifications:%@",notifications);
                RemindMeViewController *object = [[RemindMeViewController alloc] initWithNibName:@"RemindMeViewController" bundle:nil];
                //  RemindMeViewController *object=[[RemindMeViewController alloc]initWithNibName];

                NSLog(@"notifications set");
                [object scheduleNotification];
            }
            else
            {
                // [arrayTemp removeObjectAtIndex:i];
            }   
        }

        //after for loop is ended
        self.placeName= arrayTemp;
        DLog(@"remaining",arrayTemp);

        [arrayTemp release];
        [mTableView reloadData];    
    }       
}

Ответы [ 3 ]

3 голосов
/ 16 сентября 2011

Сколько времени занимает выполнение вашей функции? У вас есть только 5 секунд для выполнения задач в applicationDidEnterBackground: и возврата.

От Apple Справочник по протоколу UIApplicationDelegate :

Ваша реализация этого метода имеет примерно пять секунд для выполнить любые задачи и вернуться. Если вам нужно дополнительное время для выполнения По окончательным задачам вы можете запросить дополнительное время выполнения у система путем вызова beginBackgroundTaskWithExpirationHandler :. В На практике вы должны вернуться из applicationDidEnterBackground: как как можно быстрее. Если метод не возвращается раньше времени Ваше приложение прекращено и удалено из памяти.

Вы должны выполнять любые задачи, связанные с настройкой вашего пользовательского интерфейса. до выхода из этого метода, но другие задачи (например, сохранение состояния) должны по мере необходимости перемещаться в параллельную очередь отправки или вторичный поток. Потому что это, скорее всего, любые фоновые задачи, которые вы начинаете в applicationDidEnterBackground: не будет работать до тех пор, пока этот метод не будет выходы, вы должны запросить дополнительное время фонового выполнения до начиная эти задачи. Другими словами, первый звонок beginBackgroundTaskWithExpirationHandler: а затем запустите задачу на очередь отправки или вторичный поток.

2 голосов
/ 16 сентября 2011

Насколько я знаю, вы не должны вызывать какие-либо трудоемкие функции в applicationDidEnterBackground, так как приложение будет приостановлено через некоторое время.

Из Apple Руководство по программированию IOS

Большинство приложений, которые переходят в фоновое состояние, вскоре после этого переводятся в приостановленное состояние. Находясь в этом состоянии, приложение не выполняет никакого кода и может быть удалено из памяти в любое время. Приложения, которые предоставляют определенные услуги пользователю, могут запрашивать время фонового выполнения для предоставления этих услуг.

Гул удачи:)

1 голос
/ 16 сентября 2011

вы пытались это сделать, например, используя NSThread или сделать некоторую логику для вызова этого метода

- (void)applicationDidEnterBackground:(UIApplication *)application {
/*
 Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 
 If your application supports background execution, called instead of applicationWillTerminate: when the user quits. */}

// внутри этого метода попробуйте вызвать метод вычисления позиции возможно, он будет работать (попробуйте здесь)

...