Search code examples
iosnsurlconnectionnsurlrequestnsjsonserialization

JSON connections to show markers on a mapView


I am trying to perform three different JSON connections to populate a mapView with markers form three different MySQL tables.

This is the code I have now to do it. To test the connections, I am logging the didReceiveData method, but the compiler cursor is not arriving at that method and, of course, any marker is shown on the map.

You are kindly requested to take a look at my code and tell me what am I missing or doing wrong. Thank you.

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.title = @"Geolocalización";


    //carga de datos JSON
    //network activity indicator showed during downloading data
    //PROCESSING FIRST CONNECTION
    first_connection_url = [NSURL URLWithString:@"http://mujercanariasigloxxi.appgestion.eu/app_php_files/empresastodaslist.php"];
    NSURLRequest *first_connection_request = [NSURLRequest requestWithURL:first_connection_url];
    NSURLConnection *first_connection=[[NSURLConnection alloc]initWithRequest:first_connection_request delegate:self];

    //PROCESSING SECOND CONNECTION
    second_connection_url = [NSURL URLWithString:@"http://mujercanariasigloxxi.appgestion.eu/app_php_files/centrostodoslist.php"];
    NSURLRequest *second_connection_request = [NSURLRequest requestWithURL:second_connection_url];
    NSURLConnection *second_connection=[[NSURLConnection alloc]initWithRequest:second_connection_request delegate:self];
    //PROCESSING THIRD CONNECTION
    third_connection_url = [NSURL URLWithString:@"http://mujercanariasigloxxi.appgestion.eu/app_php_files/eventostodoslist.php"];
    NSURLRequest *thrid_connection_request = [NSURLRequest requestWithURL:third_connection_url];
    NSURLConnection *third_connection=[[NSURLConnection alloc]initWithRequest:second_connection_request delegate:self];


}

//methods to perform the connection and population of data

-(void)connection: (NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    if(connection==first_connection){
        data_for_first_connection = [[NSMutableData alloc]init];

    }
    else if(connection==second_connection){
        data_for_second_connection = [[NSMutableData alloc]init];
    }
    else if(connection==third_connection){
        data_for_third_connection = [[NSMutableData alloc]init];
    }
}

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)thedata
{
    if(connection==first_connection){
        [data_for_first_connection appendData:thedata];
        NSLog(@"CONEXION 1 AQUI");
    }
    else if(connection==second_connection){
        [data_for_second_connection appendData:thedata];
     NSLog(@"CONEXION 2 AQUI");
    }
    else if(connection==third_connection){
        [data_for_third_connection appendData:thedata];
     NSLog(@"CONEXION 3 AQUI");
    }
}
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    //if data received network indicator not visible
    [UIApplication sharedApplication].networkActivityIndicatorVisible=NO;

    if(connection==first_connection) {

        categorias_first = [NSJSONSerialization JSONObjectWithData:data_for_first_connection options:0 error:nil];

    }
    else if(connection==second_connection){

        categorias_second = [NSJSONSerialization JSONObjectWithData:data_for_second_connection options:0 error:nil];
    }
    else if(connection==third_connection){
        // PROCESS TO BE DONE FOR SECOND CONNECTION
        categorias_third = [NSJSONSerialization JSONObjectWithData:data_for_third_connection options:0 error:nil];
    }

    // Create a GMSCameraPosition that tells the map to display the
    // coordinate -33.86,151.20 at zoom level 6.
    GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:27.9847
                                                            longitude:-15.5953
                                                                 zoom:9];
    mapView_ = [GMSMapView mapWithFrame:CGRectZero camera:camera];
    mapView_.myLocationEnabled = YES;
     mapView_.delegate = self;
    self.view = mapView_;

    UISegmentedControl *mainSegment = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:@"Ofertas", @"Cursos", @"Eventos", nil]];
    [mainSegment setSegmentedControlStyle:UISegmentedControlStyleBar];
    mainSegment.frame = CGRectMake(20,80, 280, 43);
    //self.navigationItem.titleView = mainSegment;
    //mainSegment.selectedSegmentIndex = nil;
    [mainSegment addTarget:self action:@selector(mainSegmentControl:) forControlEvents: UIControlEventValueChanged];
    [self.view addSubview:mainSegment];


}

UPDATED CODE FOR TESTING THE APP.

I have updated my code to test it, now I am only working with two connections. At logging the results, I detect that arrays categoria (at first_connection) and categoria2 (at second_connection) are populated from the same JSON file (from first_connection):

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.title = @"Geolocalización";



    //carga de datos JSON
    //network activity indicator showed during downloading data
    [UIApplication sharedApplication].networkActivityIndicatorVisible=YES;

    //URL definition where php file is hosted
    //conexion1
    url = [NSURL URLWithString:@"http://mujercanariasigloxxi.appgestion.eu/app_php_files/empresastodaslist.php"];

    request = [NSURLRequest requestWithURL:url];

    first_connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];


    //conexion2
    url2 = [NSURL URLWithString:@"http://mujercanariasigloxxi.appgestion.eu/app_php_files/centrostodoslist.php"];

    request2 = [NSURLRequest requestWithURL:url];

    second_connection = [[NSURLConnection alloc] initWithRequest:request2 delegate:self];






}

//methods to perform the connection and population of data

-(void)connection: (NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{

    if ([connection isEqual:first_connection]){
        NSLog(@"FIRST CONNECTION RESPONSE");
        data = [[NSMutableData alloc]init];
    }

    if ([connection isEqual:second_connection]){
        NSLog(@"SECOND CONNECTION RESPONSE");
        data2 = [[NSMutableData alloc]init];
    }


    NSLog(@"ESTOY EN DIDRECEIVERESPONSE");
}

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)thedata
{


    if ([connection isEqual:first_connection]){
        NSLog(@"FIRST CONNECTION RECEIVED");
       [data appendData:thedata];

    }
    if ([connection isEqual:second_connection]){
        NSLog(@"SECOND CONNECTION RECEIVED");
        [data2 appendData:thedata];

    }




}
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    //if data received network indicator not visible
    [UIApplication sharedApplication].networkActivityIndicatorVisible=NO;

    //array waterfalls populated via JSON from database

    if ([connection isEqual:first_connection]){
    categorias = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
        NSLog(@"DATA1 = %@",categorias);
    }
    if ([connection isEqual:second_connection]){
    categorias2 = [NSJSONSerialization JSONObjectWithData:data2 options:0 error:nil];
        NSLog(@"DATA2 = %@",categorias2);
    }
    NSLog(@"NUMERO DE EMPRESAS OPCION1= %lu"
          , (unsigned long)[categorias count]);
    NSLog(@"NUMERO DE EMPRESAS OPCION2= %lu"
          , (unsigned long)[categorias2 count]);
    // Create a GMSCameraPosition that tells the map to display the
    // coordinate -33.86,151.20 at zoom level 6.
    GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:27.9847
                                                            longitude:-15.5953
                                                                 zoom:9];
    mapView_ = [GMSMapView mapWithFrame:CGRectZero camera:camera];
    mapView_.myLocationEnabled = YES;
     mapView_.delegate = self;
    self.view = mapView_;




    UISegmentedControl *mainSegment = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:@"Ofertas", @"Cursos", @"Eventos", nil]];
    [mainSegment setSegmentedControlStyle:UISegmentedControlStyleBar];
    mainSegment.frame = CGRectMake(20,80, 280, 43);
    //self.navigationItem.titleView = mainSegment;
    //mainSegment.selectedSegmentIndex = nil;
    [mainSegment addTarget:self action:@selector(mainSegmentControl:) forControlEvents: UIControlEventValueChanged];
    [self.view addSubview:mainSegment];


}

Solution

  • I see a couple of problems. For one, your connections, firstConnection, secondConnection, etc, are created as local variables, so they will be deallocated as soon as viewDidLoad goes out of scope. When you check for equality in the delegate methods, they will be nil at that point. You should create ivars or properties for those connections. Additionally, you shouldn't use "==" to compare objects, use isEqual: instead.

    else if([connection isEqual:third_connection]){