如何在applicationDidEnterBackground中调用函数?

时间:2011-09-16 10:08:59

标签: iphone objective-c object notifications uiapplicationdelegate

我想调用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];    
    }       
}

3 个答案:

答案 0 :(得分:3)

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

来自Apple的UIApplicationDelegate Protocol Reference

  

此方法的实现大约需要五秒钟   执行任何任务并返回。如果您需要额外的时间来执行   任何最终任务,您都可以从中请求额外的执行时间   系统通过调用beginBackgroundTaskWithExpirationHandler:。在   练习,你应该从applicationDidEnterBackground:as返回   尽快。如果方法在时间运行之前没有返回   你的申请被终止并从内存中清除。

     

您应该执行与调整用户界面相关的任何任务   在此方法退出之前,但其他任务(如保存状态)应该   根据需要移动到并发调度队列或辅助线程。   因为它可能是你开始的任何后台任务   applicationDidEnterBackground:直到该方法之后才会运行   退出,您应该在之前请求额外的后台执行时间   开始那些任务。换句话说,先打电话   beginBackgroundTaskWithExpirationHandler:然后在a上运行任务   调度队列或辅助线程。

答案 1 :(得分:2)

据我所知,您不应该在applicationDidEnterBackground中调用任何耗时的功能,因为该应用会在很短的时间后被暂停。

来自Apple的IOS Programming Guide

  

此后不久,大多数进入后台状态的应用程序都会移至暂停状态。在此状态下,应用程序不执行任何代码,可以随时从内存中删除。向用户提供特定服务的应用程序可以请求后台执行时间以提供这些服务。

Gool运气:)

答案 2 :(得分:1)

你试过这个,例如使用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. */}

//在这个方法里面尝试调用计算位置方法可能会有效(在这里试试nsthread)