我有一个应用程序,可以在核心数据managedObjectContext
中存储兴趣点(POI)。我的目标是,如果currentLocation
在managedObjectContext
的POI的指定范围内,则会发出警报。在阅读CLRegion
时,似乎可以监控的区域数量上限为20。
为了解决区域监控上限问题,我的游戏计划是浏览我的managedObjectContext
的纬度/经度坐标,并在每次我的位置管理员didUpdateLocations
在我的应用中触发时计算POI之间的距离:
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {
CLLocation *location = [locations lastObject];
NSLog(@"LocationManager Latitude %+.6f, Longitude %+.6f\n",
location.coordinate.latitude,
location.coordinate.longitude);
// TODO: compute distances between objects in managedObjectContext
[self calculateDistances];
self.currentLocation = location;
}
// method to compute distances
- (void) calculateDistances {
// for POI in managedObjectContext, do the following
CLLocation *locA = [[CLLocation alloc] initWithLatitude:self.currentLocation.coordinate.latitude longitude:self.currentLocation.coordinate.longitude];
CLLocation *locB = [[CLLocation alloc] initWithLatitude:POIlatitude longitude:POIlongitude];
CLLocationDistance distance = [locA distanceFromLocation:locB];
if (distance < 1000) {
// popup alert
}
}
我只使用managedObjectContext
来显示数据。在这种情况下,我没有显示任何内容 - 相反,当MOC
触发时,我正在浏览didUpdateLocations
中的对象,拉出坐标并计算距离。任何想法如何实现这一目标?
答案 0 :(得分:0)
我打电话给我的班级LocationManager
,这是一个单身人士班。在标题中,我为NSManagedObjectContext
添加了一个属性。
.h
@property (nonatomic, weak) NSManagedObjectContext *managedObjectContext;
我的核心数据堆栈在我的AppDelegate中,因此我调整了LocationManager
实现的init方法以“看到”它:
.m
- (id)init {
self = [super init];
if (!self.locationManager) {
// This is so I can get a reference to the managedObjectContext
AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
self.managedObjectContext = appDelegate.managedObjectContext;
self.locationManager = [[CLLocationManager alloc]init];
if ([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
[self.locationManager requestAlwaysAuthorization];
}
self.locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters;
self.locationManager.distanceFilter = 100; // meters
self.locationManager.delegate = self;
}
return self;
}
再往下,当didUpdateLocations
方法触发时,我添加了对[self calculateDistances]
的调用,如下所示:
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {
CLLocation *location = [locations lastObject];
NSLog(@"LocationManager Latitude %+.6f, Longitude %+.6f\n",
location.coordinate.latitude,
location.coordinate.longitude);
[self calculateDistances];
self.currentLocation = location;
}
// method to compute distances
- (void) calculateDistances {
NSError *error;
NSFetchRequest *coordinateRetrieval = [[NSFetchRequest alloc]initWithEntityName:@"PointOfInterest"];
NSArray *pois = [self.managedObjectContext executeFetchRequest:coordinateRetrieval error:&error];
for (PointOfInterest *venue in poi) {
CLLocation *locA = self.currentLocation;
CLLocation *locB = [[CLLocation alloc]initWithLatitude:[venue.latitude doubleValue] longitude:[venue.longitude doubleValue]];
CLLocationDistance distance = [locA distanceFromLocation:locB];
if (distance < 1000) {
// popup alert
}
NSLog(@"The distance from currentLocation to venue is %lf meters", distance);
}
}