Geocerca do iOS, como lidar com a região quando o monitoramento é iniciado?

Não consegui descobrir como lidar com um cenário em que o telefone já está dentro de uma região quandostartMonitoringForRegion é chamado? Outras perguntas sugeriram chamadasrequestStateForRegion dentrodidStartMonitoringForRegion isso então chama o métododidDetermineState: forRegion:. Portanto, o código se parece com isso:

- (void)viewDidLoad {
    //location manager set up etc...
    for (Object *object in allObjects){

        CLRegion *region = [self geofenceRegion:object];
        [locationManager startMonitoringForRegion:region];
     }
}

- (void)locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(CLRegion *)region {

    [self.locationManager requestStateForRegion:region];
    [self.locationManager performSelector:@selector(requestStateForRegion:) withObject:region afterDelay:5];
 }

- (void)locationManager:(CLLocationManager *)manager
  didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region {

    if (state == CLRegionStateInside){
        [self locationManager:locationManager didEnterRegion:region];
    }  
}

Agora, obviamente, o método geofenceRegion é meu e funciona bem, e os objetos contêm coisas como lat long e radius e que tudo funciona bem também, de modo que esse não é o problema aqui.

De qualquer forma, o problema com o código acima é que ele funciona se o usuário já estiver dentro da região ao adicionar a região ao dispositivo (por exemplo, didEnterRegion está pronto). No entanto, o problema é que o métododidDetermineState: forRegion: também é chamado toda vez que uma das regiões de fronteira é atravessada de acordo com os documentos da apple:

O gerente de localização chama esse método sempre que houver uma transição de limite para uma região. Ele chama esse método além de chamar os métodos locationManager: didEnterRegion: e locationManager: didExitRegion:. O gerenciador de localizações também chama esse método em resposta a uma chamada ao método requestStateForRegion:, que é executado de forma assíncrona.

Agora, por isso, toda vez que uma região é inserida,didEnterRegion é chamado automaticamente, mas é chamado novamente porquedidDetermineState: forRegion: também é chamado automaticamente de acordo com os documentos da apple e isso resulta emdidEnterRegion sendo chamado novamente para que a região seja inserida duas vezes quando eu quero que seja inserida apenas uma vez. Como posso evitar isso?

Obrigado pela ajuda.

SOLUÇÃO

A solução é realmente tão simples que eu estava fazendo o caminho errado. Eu tive que optar por usar os 2 métodosdidEnterRegion: edidExitRegion ou usedidDetermineState: forRegion e criar meus próprios métodos para entrar e sair da região,ambos não devem ser usados.

Então, eu escolhi usar apenas odidDetermineState: forRegion método e meu código agora se parece com isso:

Observe que, com esse método, a região de saída será chamada para a região, se não estiver dentro, e se, como eu, você quiser que a saída ocorra apenas após a entrada, será necessário algum tipo de método para verificar se a região já foi inserida. (Eu mesmo usei dados principais, pois já estava usando isso para armazenar outros aspectos das regiões).

- (void)viewDidLoad {
    //location manager set up etc...
    for (Object *object in allObjects){

        CLRegion *region = [self geofenceRegion:object];
        [locationManager startMonitoringForRegion:region];
     }
}

- (void)locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(CLRegion *)region {

    [self.locationManager performSelector:@selector(requestStateForRegion:) withObject:region afterDelay:5];
}

- (void)locationManager:(CLLocationManager *)manager
  didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region {

    if (state == CLRegionStateInside){

        [self enterGeofence:region];

    } else if (state == CLRegionStateOutside){

        [self exitGeofence:region];

    } else if (state == CLRegionStateUnknown){
        NSLog(@"Unknown state for geofence: %@", region);
        return;
    }
}

- (void)enterGeofence:(CLRegion *)geofence {

    //whatever is required when entered
}

- (void)exitGeofence:(CLRegion *)geofence {

    //whatever is required when exit
}

questionAnswers(1)

yourAnswerToTheQuestion