Ios 将用户位置传递给MKMapItem

Ios 将用户位置传递给MKMapItem,ios,objective-c,xcode,facebook-graph-api,mkmapitem,Ios,Objective C,Xcode,Facebook Graph Api,Mkmapitem,我已经显示了用户位置,我想在MKMApItem中显示那些获取的位置。 我知道在MKMapItem中显示的方式。但是我无法将这些获取的位置传递给MapItem类。您能帮我传递这些值吗 FBRequest *friendRequest = [FBRequest requestForGraphPath:@"me/friends?field=name,location,hometown"]; [ friendRequest startWithCompletionHandler:^(FBRequestCo

我已经显示了用户位置,我想在
MKMApItem
中显示那些获取的位置。 我知道在
MKMapItem
中显示的方式。但是我无法将这些获取的位置传递给MapItem类。您能帮我传递这些值吗

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"]);
如何将这些位置传递给
MKMapItem

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

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

提前感谢。

我回答了如何处理多个地理编码请求以响应您的另一个请求的问题,因此我将不再在这里重复该叙述

总之,我建议你试试:

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];
}];
然后,您可以调整中提供的答案:

-(void)geocodeFriendRequestResponse:(NSArray*)好友
{
CLGeocoder*geocoder=[[CLGeocoder alloc]init];
NSMutableArray*mapItems=[NSMutableArray];
NSOperationQueue*队列=[[NSOperationQueue alloc]init];
NSOperation*finalCompletionOperation=[NSBlockOperation blockOperationWithBlock:^{
[MKMapItem openmpswithitems:mapItems启动选项:nil];
}];
NSOperation*previousCompletionHandler=nil;
用于(FBGraphObject*朋友中的朋友)
{
NSString*地址=[friend.location objectForKey:@“name”];
//为地理编码请求本身创建一个块
NSBlockOperation*geocodeRequest=[[NSBlockOperation alloc]init];
//使此geo请求依赖于先前geocode请求完成块的完成
if(previousCompletionHandler)[geocodeRequest addDependency:previousCompletionHandler];
//为地理编码请求完成块创建块
NSBlockOperation*geocodeCompletionHandler=[[NSBlockOperation alloc]init];
//最终的“openMapsWithItems”取决于此地理代码请求完成块的完成
[FinalCompletionOperationAddDependency:geocodeCompletionHandler];
//让我们启动地理编码请求
[geocodeRequest addExecutionBlock:^{
[geocoder geocodeAddressString:address completionHandler:^(NSArray*位置标记,NSError*错误){
//完成后,我们将启动geocode请求完成块
[geocodeCompletionHandler addExecutionBlock:^{
如果(错误)
NSLog(@“%@”,错误);
如果([placemarks count]>0),则为else
{
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];
}
}];
[队列添加操作:geocodeCompletionHandler];
}];
}];
[队列添加操作:geocodeRequest];
previousCompletionHandler=geocodeCompletionHandler;
}
[队列添加操作:最终完成操作];
}

该例程是确保多个地理代码请求不会同时发生的复杂方法。这背后的逻辑将得到更详细的解释。

顺便说一句,虽然我已经测试了地理编码逻辑,但我还没有将其与Facebook逻辑一起测试,所以请让我知道它是如何运行的。@Rob嗨Rob..我已经给你发了邮件询问了一些问题..请务必回答我的问题..提前谢谢。。
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];
}];
- (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];
}