Search code examples
iosobjective-cgoogle-maps-sdk-ios

GMSGeoCoder reverseGeocodeCoordinate: completionHandler: on background thread


I need to get the city name from 2 coordinates (I'm using GMSGeoCoder -reverseGeocodeCoordinate: completionHandler: method) and then to comapre the objects.

The problem is that the method is running on a background thread (not in the main thread) and when I try to compare (using if statement) the objects (userCity and storeCity- both NSString) is still nil.

My code:

//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 store's city
        __block NSString *storeCity;
        [[GMSGeocoder geocoder]reverseGeocodeCoordinate:arounder.radiusCircularRegion.center completionHandler:^(GMSReverseGeocodeResponse *response, NSError *error) {
            if (error) {
                NSLog(@"%@",[error description]);
            }
            arounderCity=[[[response results] firstObject] locality];
        }];
        if ([userCity isEqualToString:arounderCity]) {
            return YES;
        }

Any idea? Thanks!


Solution

  • Restructure your code to proceed after the async tasks are done:

    This also has the benefit that you don't actively wait for stuff and block the main thread

    e.g.:

    - (void)checkCitiesWithCompletionBlock:(void (^)(BOOL same))
        //Checking user's city
        [[GMSGeocoder geocoder]reverseGeocodeCoordinate:self.locationManager.location.coordinate completionHandler:^(GMSReverseGeocodeResponse *response, NSError *error) {
            if (error) {
                NSLog(@"%@",[error description]);
            }
            id userCity=[[[response results] firstObject] locality];
    
            //Checking store's city
            [[GMSGeocoder geocoder]reverseGeocodeCoordinate:arounder.radiusCircularRegion.center completionHandler:^(GMSReverseGeocodeResponse *response, NSError *error) {
                if (error) {
                    NSLog(@"%@",[error description]);
                }
                id arounderCity=[[[response results] firstObject] locality];
    
                same ([userCity isEqualToString:arounderCity]);
            }];
        }];
    }