applicationDidEnterBackground

applicationDidEnterBackground

我想在applicationDidEnterBackground中调用一个函数,该函数在其他控制器中定义。

我已经创建了一个对象来访问它,但是似乎函数在被调用时被杀死。

这是基本计算距离并发布通知的功能

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

最佳答案

您的功能需要多长时间才能完成?您只有5秒的时间在applicationDidEnterBackground:中执行任务并返回。

从Apple的UIApplicationDelegate Protocol Reference


  您实施此方法大约需要五秒钟
  执行任何任务并返回。如果您需要更多时间执行
  任何最终任务,您都可以从
  通过调用beginBackgroundTaskWithExpirationHandler:系统。在
  实践中,您应该从applicationDidEnterBackground:返回
  尽快。如果该方法在时间运行之前未返回
  终止您的应用程序并从内存中清除。
  
  您应该执行与调整用户界面有关的所有任务
  在此方法退出之前,但其他任务(例如保存状态)应
  根据需要移动到并发调度队列或辅助线程。
  因为您可能从中开始任何后台任务
  applicationDidEnterBackground:直到该方法之后才运行
  退出,您应该在请求额外的后台执行时间之前
  开始这些任务。换句话说,第一个电话
  beginBackgroundTaskWithExpirationHandler :,然后在
  分派队列或辅助线程。

09-07 14:06