1

リージョンモニタリングを設定しようとしています。かなり簡単に見えます。しかし、監視しているリージョンの数を確認すると、カウントは常に0です。

コード:

if ([CLLocationManager regionMonitoringAvailable] &&
    [CLLocationManager regionMonitoringEnabled] ) {

    CLLocationCoordinate2D coordinate;
    double radius;

    for(Item *item in ad.proxiArray) {

        radius = [item.distance floatValue];

        coordinate= CLLocationCoordinate2DMake([item.latitude doubleValue],
                                                [item.longitude doubleValue]);
        CLRegion *region = [[CLRegion alloc] initCircularRegionWithCenter:coordinate radius:radius identifier:item.place];

        NSLog(@"Adding: %@", region);

        [self.locationManager startMonitoringForRegion:region desiredAccuracy:kCLLocationAccuracyNearestTenMeters];

        [region release];
    }   
    NSLog(@"region count %i",[[self.locationManager monitoredRegions] count]);
    for (CLRegion *re in [self.locationManager monitoredRegions]) {
        NSLog(@"Monitoring: %@", re);
    }
} else {
    NSLog(@"Region monitoring unavailable");
}

実行すると、NSLogは、実際にすべてのアイテム(約10)を追加していることを示します。しかし、上記のように、ループの終わりに:

2010-12-21 12:14:38.172 xxxxxx [8112:307]リージョンカウント0

どうしたの????

4

1 に答える 1

1

というのが私の感想です

  • CLLocationManager 自体はスレッドセーフではありません。地域の監視と位置の監視が干渉し、ブロックが発生する場合があります (私の観察では、プログラムは 30 秒以上経過しても動作し続けるため、一種のタイムアウトが必要です)。
  • リージョンは非同期に追加されるため、リージョンの追加が完了したときにリージョンの数を直接確認すると、間違った結果が生じる可能性があります。
  • 実際に地域を追加して監視すると精度が非常に悪い(分解能数km)

これらの問題と、地域の監視があまり正確ではないという事実のために、私はその機能を使用するという考えを断念しました.

于 2011-01-02T08:55:59.957 に答える