我想在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 :,然后在
分派队列或辅助线程。