Передача местоположения пользователя в MKMapItem
Я отобразил местоположение пользователя, и я хочу отобразить эти извлеченные местоположения в 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"]);
и мой вывод:
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
как я должен передать эти места MKMapItem
учебный класс
- (IBAction)onClick:(id)sender {
Class mapItemClass=[MKMapItem class];
if(mapItemClass &&[mapItemClass respondsToSelector:@selector(openMapsWithItems:launchOptions:)])
{...}}
Заранее спасибо..
1 ответ
Я ответил на вопрос о том, как сделать несколько запросов геокодирования в ответ на ваш другой вопрос, поэтому я воздержусь от повторения этого повествования здесь.
Итог, я бы просто предложил вам попробовать:
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];
}];
и затем вы можете настроить ответ, представленный в разделе " Несколько местоположений на карте" (используя MKMapItem и 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];
}
Эта процедура представляет собой сложный способ гарантировать, что множественные запросы геокодирования не происходят одновременно. Логика этого объясняется более подробно для нескольких местоположений на карте (используя MKMapItem и CLGeocoder).