如何在 applicationDidEnterBackground 中调用函数?

Posted

技术标签:

【中文标题】如何在 applicationDidEnterBackground 中调用函数?【英文标题】:How to call a function in applicationDidEnterBackground? 【发布时间】:2011-09-16 10:08:58 【问题描述】:

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

【问题讨论】:

这里面有没有具体的函数定义方式。 NSLog(@"ho gaya bhai");阿比华基纳希? 【参考方案1】:

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

来自苹果的UIApplicationDelegate Protocol Reference:

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

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

【讨论】:

我怎样才能检查函数需要多长时间,我们也可以在其中应用计时器。 @IphoneBites:您可以通过使用NSTimer 并将持续时间打印到控制台来大致检查它需要多长时间。 @IphoneBites:更好的是,在 Instruments 中使用 Time Profiler。【参考方案2】:

据我所知,您不应在 applicationDidEnterBackground 中调用任何耗时的函数,因为该应用会在短时间内暂停。

来自 Apple 的 ios Programming Guide

大多数进入后台状态的应用程序很快就会进入挂起状态。在这种状态下,应用程序不会执行任何代码,并且可能随时从内存中删除。向用户提供特定服务的应用程序可以请求后台执行时间以提供这些服务。

祝你好运:)

【讨论】:

【参考方案3】:

你有没有尝试过,例如使用 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. */

//在这个方法里面尝试调用calculate position方法可能会起作用(在这里试试nsthread)

【讨论】:

以上是关于如何在 applicationDidEnterBackground 中调用函数?的主要内容,如果未能解决你的问题,请参考以下文章

在QGIS中如何添加天地图的WMTS

如何在表单提交后保留文本(如何在提交后不删除自身?)

如何在异步任务中调用意图?或者如何在 onPostExecute 中开始新的活动?

在 Avkit 中如何使用这三行代码,以及如何将音乐静音”

如何在 JDBC 中启动事务?

如何在 Fragment 中调用 OnActivityResult 以及它是如何工作的?