title: Batch Geocode MKLocalSearchResponse
body: <p>I have a search setup that displays the response of a MKLocalSearchRequest in UITableVIew</p>
  
  <p>I want to clean up <em>all</em> the responses from the response of each search. Here is my shot at accomplishing this so far, inspired by this post <a href="https://stackoverflow.com/questions/14195706/multiple-locations-on-map-using-mkmapitem-and-clgeocoder/14198584?noredirect=1#comment39688814_14198584">Multiple Locations on Map (using MKMapItem and CLGeocoder)</a></p>
  
  <p>Here is my code. </p>
  
  <pre><code>@interface ViewController () &lt;UISearchBarDelegate,UISearchDisplayDelegate,UITextFieldDelegate&gt;
  @property (nonatomic, strong) UISearchDisplayController *searchController;
  @property (nonatomic, strong) UISearchBar *searchBar;
  
  @property (nonatomic, strong) MKLocalSearch *localSearch;
  @property (nonatomic, strong) MKLocalSearchResponse *localSearchResponse;
  
  @property (nonatomic, strong) NSArray *dirtyResponseArray;
  @property (nonatomic, strong) NSMutableArray *geocodedResultsArray;
  @end
  
  @implementation ViewController
  
  -(void)startSearch:(NSString *)searchString
  {
      if (self.localSearch.searching)
          [self.localSearch cancel];
  
      MKLocalSearchRequest *request = [[MKLocalSearchRequest alloc] init];
      request.naturalLanguageQuery = searchString;
      request.region = MKCoordinateRegionMake(self.currentLocation.coordinate, self.mapView.region.span);
  
      MKLocalSearchCompletionHandler completionHandler = ^(MKLocalSearchResponse *response, NSError *error){
  
          if (error != nil) return;
  
          else {
              self.dirtyResponseArray = response.mapItems;                
              [self operation];
              [self.searchController.searchResultsTableView reloadData];
              [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
          }
  
          [self.searchDisplayController.searchResultsTableView reloadData];
      };
  
      if (self.localSearch != nil)
          self.localSearch = nil;
  
      self.localSearch = [[MKLocalSearch alloc] initWithRequest:request];
      [self.localSearch startWithCompletionHandler:completionHandler];
  }
  
  -(void)operation
  {
      CLGeocoder *geocoder = [[CLGeocoder alloc]init];
      NSOperationQueue *queue = [[NSOperationQueue alloc] init];
  
      NSOperation *finalCompletionOperation = [NSBlockOperation blockOperationWithBlock:^{
          [MKMapItem openMapsWithItems:self.geocodedResultsArray launchOptions:nil];
          NSLog(@"Local Search Response To use in tableview =================== %@", self.geocodedResultsArray);
      }];
  
      NSOperation *previousCompletionHandler = nil;
  
      //Issue is probably right here. How should I handle the MKMapItem in the array?
      //NSString *address = [self.dirtyResponseArray valueForKey:@"address"][@"formattedAddress"]; ??
  
      for (NSString *address in self.dirtyResponseArray) {
  
          NSBlockOperation *geocodeRequest = [[NSBlockOperation alloc] init];
          if (previousCompletionHandler) [geocodeRequest addDependency:previousCompletionHandler];
          NSBlockOperation *geocodeCompletionHandler = [[NSBlockOperation alloc] init];
          [finalCompletionOperation addDependency:geocodeCompletionHandler];
  
          [geocodeRequest addExecutionBlock:^{ [geocoder geocodeAddressString:address 
                          completionHandler:^(NSArray *placemarks, NSError *error) 
          {
                  [geocodeCompletionHandler addExecutionBlock:^{
                      if (error) NSLog(@"%@", error);
  
                      else if ([placemarks count] &gt; 0)
                      {
                          CLPlacemark *geocodedPlacemark = [placemarks objectAtIndex:0];
  
                          MKPlacemark *placemark = [[MKPlacemark alloc] initWithCoordinate:geocodedPlacemark.location.coordinate
                                                                         addressDictionary:geocodedPlacemark.addressDictionary];
  
                          MKMapItem *mapItem = [[MKMapItem alloc] initWithPlacemark:placemark];
                          [mapItem setName:geocodedPlacemark.name];
                          [self.geocodedResultsArray addObject:mapItem];
                      }
                  }];
                  [queue addOperation:geocodeCompletionHandler];
              }];
          }];
          [queue addOperation:geocodeRequest];
          previousCompletionHandler = geocodeCompletionHandler;
      }
      [queue addOperation:finalCompletionOperation];
  }
  @end
  </code></pre>
  
  <p>I'm not sure how to handle each MKMapItem. Right now its throwing this error</p>
  
  <pre><code> -[MKMapItem length]: unrecognized selector sent to instance 0x7f813c9c6200
  </code></pre>