【问题标题】:Location alerts using Core Data to get around CLRegion 20 region cap使用核心数据的位置警报绕过 CLRegion 20 区域上限
【发布时间】:2015-05-29 19:39:02
【问题描述】:

我有一个将兴趣点 (POI) 存储在核心数据 managedObjectContext 中的应用。我的目标是在currentLocation 位于managedObjectContext 中的 POI 的指定范围内时发出警报。在阅读CLRegion 时,似乎可以监控的区域数量上限为 20。

为了绕过区域监控上限,我的游戏计划是在每次我的位置经理的didUpdateLocations 在我的应用程序中触发时,浏览我的managedObjectContext 以获取纬度/经度坐标并计算 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 来显示数据。在这种情况下,我没有显示任何内容——相反,我只是在didUpdateLocations 触发时穿过我的MOC 中的对象,提取坐标并计算距离。任何想法如何做到这一点?

【问题讨论】:

  • 我不确定我是否理解这个问题。如果您不想显示数据,请不要执行任何将其显示在屏幕上的代码。哪一部分没有意义?
  • 我更新了我的帖子以增加说明。

标签: core-data ios8 cllocationmanager geofencing


【解决方案1】:

我给我的班级打电话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);
    }
}

【讨论】:

    猜你喜欢
    • 2012-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多