Passing user location to MKMapItem

时光怂恿深爱的人放手 提交于 2019-12-06 14:16:00

问题


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:


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).



来源:https://stackoverflow.com/questions/14235717/passing-user-location-to-mkmapitem

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!