Passing user location to MKMapItem

529 views Asked by At

I've displayed user location and i want to display those fetched locations in MKMApItem. I know the way to display in MKMapItem..But i cant pass those fetched locations to MapItem class..can u help me in passing those values

FBRequest *friendRequest = [FBRequest requestForGraphPath:@"me/friends?field=name,location,hometown"];
[ friendRequest startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error){
    NSArray *data = [result objectForKey:@"data"];

    for (FBGraphObject<FBGraphUser> *friend in data) {
        NSLog(@"%@:%@", [friend name ],[friend.location objectForKey:@"name"]);

and my output is:

2013-01-09 17:47:57.096 istb[296:1a03] Athish:Cochin, Kerala
2013-01-09 17:47:57.096 istb[296:1a03] Anges:Mumbai
.
.
.
.
2013-01-09 17:47:57.097 istb[296:1a03] Raja:Delhi
2013-01-09 17:47:57.097 istb[296:1a03] Rajesh:Canada

how should i pass these locations to MKMapItem class

- (IBAction)onClick:(id)sender {
Class mapItemClass=[MKMapItem class];

if(mapItemClass &&[mapItemClass respondsToSelector:@selector(openMapsWithItems:launchOptions:)])
{...}}

Thanks in Advance..

1

There are 1 answers

2
Rob On

I answered the question of how to do multiple geocode requests in response to your other question, so I'll refrain from repeating that narrative here.

Bottom line, I'd just suggest that you try:

FBRequest *friendRequest = [FBRequest requestForGraphPath:@"me/friends?field=name,location,hometown"];
[friendRequest startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
    NSArray *friends = [result objectForKey:@"data"];
    [self geocodeFriendRequestResponse:friends];
}];

and then you can tweak the answer provided in Multiple Locations on Map (using MKMapItem and CLGeocoder):

- (void)geocodeFriendRequestResponse:(NSArray *)friends
{
    CLGeocoder *geocoder = [[CLGeocoder alloc]init];
    NSMutableArray *mapItems = [NSMutableArray array];

    NSOperationQueue *queue = [[NSOperationQueue alloc] init];

    NSOperation *finalCompletionOperation = [NSBlockOperation blockOperationWithBlock:^{
        [MKMapItem openMapsWithItems:mapItems launchOptions:nil];
    }];

    NSOperation *previousCompletionHandler = nil;

    for (FBGraphObject<FBGraphUser> *friend in friends)
    {
        NSString *address = [friend.location objectForKey:@"name"];

        // create a block for the geocode request itself

        NSBlockOperation *geocodeRequest = [[NSBlockOperation alloc] init];

        // make this geo request dependent upon the completion of the prior geocode request completion block

        if (previousCompletionHandler) [geocodeRequest addDependency:previousCompletionHandler];

        // create a block for the geocode request completion block

        NSBlockOperation *geocodeCompletionHandler = [[NSBlockOperation alloc] init];

        // The final `openMapsWithItems` is contingent on the completion of this geocode request completion block

        [finalCompletionOperation addDependency:geocodeCompletionHandler];

        // let's initiate the geocode request

        [geocodeRequest addExecutionBlock:^{
            [geocoder geocodeAddressString:address completionHandler:^(NSArray *placemarks, NSError *error) {

                // upon completion, we'll initiate the geocode request completion block

                [geocodeCompletionHandler addExecutionBlock:^{
                    if (error)
                        NSLog(@"%@", error);
                    else if ([placemarks count] > 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];

                        [mapItems addObject:mapItem];
                    }
                }];

                [queue addOperation:geocodeCompletionHandler];
            }];
        }];

        [queue addOperation:geocodeRequest];

        previousCompletionHandler = geocodeCompletionHandler;
    }

    [queue addOperation:finalCompletionOperation];
}

This routine is a complicated way of ensuring that the multiple geocode requests do not happen concurrently. The logic behind this is explained in greater detail Multiple Locations on Map (using MKMapItem and CLGeocoder).