MkMapView に約 10 の場所 (およびそれぞれの注釈) を表示する必要があり、ボタンを押した後、さまざまな JSON 解析結果に従って新しいさまざまな注釈を追加する必要があります (たとえば、locationIDValue < 100 は赤いピンを意味し、それ以外の場合は緑を意味します)。これは単純化されたコードです:
- (void)viewDidLoad
{
[super viewDidLoad];
map.showsUserLocation = true;
map.mapType = MKMapTypeStandard;
arrayID = [[NSMutableArray alloc] initWithObjects: @"id1", @"id2", @"id3", @"id4", @"id5", @"id6", @"id7", @"id8", @"id9", @"id10", nil];
#define MakeLocation(lat,lon) [[CLLocation alloc] initWithLatitude:lat longitude:lon]
locations= @[ MakeLocation(lat1,lon1), MakeLocation(lat2,lon2), MakeLocation(lat3,lon3), MakeLocation(lat4,lon4), MakeLocation(lat5,lon5), MakeLocation(lat6,lon6), MakeLocation(lat7,lon7), MakeLocation(lat8,lon8), MakeLocation(lat9,lon9), MakeLocation(lat10,lon10) ];
for (int l=0; l<[locations count]; l++) { // HERE ITS PERFECT! I CAN SEE ALL 10 ANNOTATIONS!
MKPointAnnotation* annotation= [MKPointAnnotation new];
annotation.coordinate = [locations[l] coordinate];
[map addAnnotation: annotation];
}
}
と
- (IBAction)parseMethod {
[map removeAnnotations:map.annotations];
for (int i=0; i < [arrayID count]; i++) { // arrayID contains ID values to parse for each location
NSURL *url = [NSURL URLWithString:
[NSString stringWithFormat:
@"http://JSONPARSINGURL/%@",[arrayID objectAtIndex:i]]];
NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:5.0];
operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
// PARSING CODE . . .
NSMutableArray *value = [JSON objectForKey:@"value"];
NSMutableDictionary *value0 = [value objectAtIndex:0];
[valueID replaceObjectAtIndex:i withObject:[value0 objectForKey:@"valueID"]];
locationIDValue = [[valueID objectAtIndex:i] intValue]; // locationIDValue contains the values that i must use to put different annotations on the map
NSLog(@"locationIDValue: %d", locationIDValue); // here I control IF app parses all the values of locationIDValue
[table reloadData]; // here I put another control to see all values parsed
}
failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
NSLog(@"FAILURE");
}];
NSOperationQueue *queue = [[NSOperationQueue alloc] init]; // I have used also simple [operation start] but I have same issue!
[queue addOperation:operation];
[queue waitUntilAllOperationsAreFinished];
}
NSLog(@"END PARSING"); // here I control the end of parsing, so now I can add new annotations to MKMapView according to locationIDValue array
MKPointAnnotation *annotation = [[MKPointAnnotation alloc] init];
for (int l=0; l<[locations count]; l++) { // HERE I CAN SEE ONLY A SINGLE LOCATION!
annotation.coordinate = [locations[l] coordinate];
NSLog(@"%f - %f", annotation.coordinate.latitude, annotation.coordinate.longitude); // here I control IF app parses all the values of coordinates
[map addAnnotation: annotation];
}
}
と
- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation {
MKPinAnnotationView *pinView=[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"pinView"];
pinView.animatesDrop=YES;
if (annotation != map.userLocation)
{
if ( locationIDValue <= 100) {
pinView.pinColor = MKPinAnnotationColorRed;
return pinView;
}
pinView.pinColor = MKPinAnnotationColorGreen;
return pinView;
}
else
map.userLocation.title = @"My position";
return nil;
}
状況: アプリを初めて開くと、#define MakeLocation の緯度と経度に従って、すべての注釈がマップ上に表示されます。しかし、ボタンを押して parseMethod を開始すると、数秒待ちます (NSOperationQueue によると、単純な [操作開始] コードを使用して、キューなしでもテストできます)、マップ上に 1 つの注釈のみが表示されます。 、常に同じで、奇妙なことに lat5-lon5 座標を持つ 5 番目の場所にあります (それ以外の場合、いくつかのコードを変更すると、すべての注釈が同じ場所にドロップされていることがわかります)。ご覧のとおり、いくつかの NSLog コードを記述し、UITableView を追加してアクティビティを制御すると、次のようになります。
END PARSING
coordinates: lat1 - lon1
coordinates: lat2 - lon2
coordinates: lat3 - lon3
coordinates: lat4 - lon4
coordinates: lat5 - lon5 <--- THE STRANGE POSITION
coordinates: lat6 - lon6
coordinates: lat7 - lon7
coordinates: lat8 - lon8
coordinates: lat9 - lon9
coordinates: lat10 - lon10
locationIDValue: 100
locationIDValue: 90
locationIDValue: 50
locationIDValue: 120
locationIDValue: 20
locationIDValue: 40
locationIDValue: 80
locationIDValue: 180
locationIDValue: 140
locationIDValue: 10
まあ、それは完璧なようです: アプリはすべてのデータを解析します (また、UITableView は解析されたすべての新しい値を行に入力します)。さて、ここで何が問題なのですか?解析後に 1 つの注釈しか表示されないのはなぜですか? または、すべての注釈が同じ場所にドロップされますか? 助けてください!