Search code examples
iosobjective-ciphonecocoa-touchgoogle-maps-sdk-ios

Comparing 2 cities from 2 locations in background


I have an app that the user saves a location and set the radius to be notified about it: 1KM, 5KM (the user will recive a notification if the location he saved earlier and he's current location in in the setted radius) and "City" (the user will recive a notification if the city of the location he saved earlier and the city where he currently is are the same city).

Note: I'm using Google Maps iOS SDK.

I have a method called -sendNotificationIfNeeded that checks if to send a notification, code:

-(void)sendNotificationIfNeeded
{    
    if (self.muteEnabled==YES) { //Check if the user muted the app
        NSLog(@"Mute enabled");
        return;
    }

    //Important part:
    if([self checkIfUserInRadiusForLocation:[self.savedLocations objectAtIndex:0]])
    {
        UILocalNotification *notification=[self createNotification];
        [self sendNotification:notification];
    }
}

The method checkIfUserInRadiusForLocation check the radius of the savedLocation (CLCircularRegion) and checks if the user is inside this radius, code:

-(BOOL)checkIfUserInRadiusForLocation:(SavedLocation*)location
{
    if(location.radiusString isEqualToString:@“1KM”)
    {
        if(location.circularRegion containsCoordinate:self.locationManager.location.coordinate)
        {
            return YES;
        }
    }else if(location.radiusString isEqualToString:@“5KM”)
    {
        if(location.circularRegion containsCoordinate:self.locationManager.location.coordinate)
        {
            return YES;
        }
    //Important part:
    }else if(location.radiusString isEqualToString:@“City”)
    {
        if([self checkIfUserCityIsSameToLocation:location)
        {
            return YES;
        }
    }
    return NO;
}

The method checkIfUserCityIsSameToLocation: finds the savedLocation city and the user's location city and checks if they're equals (the problem is here), code:

-(BOOL)checkIfUserCityIsSameToLocation:(savedLocation*)location
{
    //Checking user's city
    __block NSString *userCity;
    [[GMSGeocoder geocoder]reverseGeocodeCoordinate:self.locationManager.location.coordinate completionHandler:^(GMSReverseGeocodeResponse *response, NSError *error) {
        if (error) {
            NSLog(@"%@",[error description]);
        }
        userCity=[[[response results] firstObject] locality];
    }];
    //Checking savedLocation’s city
    __block NSString *savedLocationCity;
    [[GMSGeocoder geocoder]reverseGeocodeCoordinate:location.circularRegion.center completionHandler:^(GMSReverseGeocodeResponse *response, NSError *error) {
        if (error) {
            NSLog(@"%@",[error description]);
        }
        savedLocationCity=[[[response results] firstObject] locality];

        NSLog(@"");
    }];

    if ([userCity isEqualToString:savedLocationCity]) { //Both string cities are nil
        Return YES;
    }else
    {
        Return No
    }
}

The problem is that when the app reaching the if statment on checkIfUserCityIsSameToLocation: both userCity and savedLocationCity are nil (becuase reverseGeocodeCoordinate: completionHandler: method is running on a background thread).

I can't figure out how to solve it,

I'll really appriciate if someone will help me with this.

Thank you very much!


Solution

  • Do it like this:

    -(BOOL)checkIfUserInRadiusForLocation:(SavedLocation*)location userCity: (NSString *) userCity locationCity: (NSString *) locationCity
    {
        if(location.radiusString isEqualToString:@“1KM”)
        {
          if(location.circularRegion containsCoordinate:self.locationManager.location.coordinate)
          {
            return YES;
          }
        }else if(location.radiusString isEqualToString:@“5KM”)
        {
          if(location.circularRegion containsCoordinate:self.locationManager.location.coordinate)
          {
            return YES;
          }
        //Important part:
        }else if(location.radiusString isEqualToString:@“City”)
        {
          if([userCity isEqual: locationCity])
          {
            return YES;
          }
        }
    return NO;
    }
    
    
    -(void)sendNotificationIfNeeded
    {    
        if (self.muteEnabled==YES) { //Check if the user muted the app
            NSLog(@"Mute enabled");
            return;
        }
        SavedLocation* location = [self.savedLocations objectAtIndex:0];
        [[GMSGeocoder geocoder]reverseGeocodeCoordinate:self.locationManager.location.coordinate completionHandler:^(GMSReverseGeocodeResponse *response, NSError *error) {
        if (error) {
            NSLog(@"%@",[error description]);
        }
        NSString *userCity=[[[response results] firstObject] locality];
       [[GMSGeocoder geocoder]reverseGeocodeCoordinate:location.circularRegion.center completionHandler:^(GMSReverseGeocodeResponse *response, NSError *error) {
        if (error) {
            NSLog(@"%@",[error description]);
        }
        NSString *savedLocationCity=[[[response results] firstObject] locality];
    
        if([self checkIfUserInRadiusForLocation:location userCity: userCity locationCity: savedLocationCity])
        {
          UILocalNotification *notification=[self createNotification];
          [self sendNotification:notification];
        }
        }];
      }];
    }