1

Using iOS 8.0.

I am using Google API for getting the location.and I want to reduce the coding using NSPredicate and KeyPath.

I am using below link for getting the google response, iPhone - Get City name from Latitude and Longtiude Using answer of user @'Constantin Saulenco'.

If I would a Sql developer I would write a query like,

  1. (select address_components from MAIN_TABLE where types like 'postal_code') from this I will get NAME_TABLE rows.

2.select long_name from NAME_TABLE where types like 'locality' 

For that I am using below code,After watching the @ztan's answer I have changed the coding like this

Edit: Answer

 NSArray *addressArray = json[@"results"];
NSPredicate *predicateForTypes=[NSPredicate predicateWithFormat:@"(types CONTAINS 'postal_code')"];
addressArray=([addressArray filteredArrayUsingPredicate:predicateForTypes][0])[@"address_components"];

NSPredicate *predicateForCity=[NSPredicate predicateWithFormat:@"(types CONTAINS 'locality')"];
NSString *cityName=([addressArray filteredArrayUsingPredicate:predicateForCity][0])[@"long_name"];

I have below JSON...

 {
        "address_components" =     (
                    {
                "long_name" = 221;
                "short_name" = 221;
                types =             (
                    "street_number"
                );
            },
                    {
                "long_name" = "Juniper Drive";
                "short_name" = "Juniper Dr";
                types =             (
                    route
                );
            },
                    {
                "long_name" = "North Kingstown";
                "short_name" = "North Kingstown";
                types =             (
                    locality,
                    political
                );
            },
                    {
                "long_name" = "Washington County";
                "short_name" = "Washington County";
                types =             (
                    "administrative_area_level_2",
                    political
                );
            },
                    {
                "long_name" = "Rhode Island";
                "short_name" = RI;
                types =             (
                    "administrative_area_level_1",
                    political
                );
            },
                    {
                "long_name" = "United States";
                "short_name" = US;
                types =             (
                    country,
                    political
                );
            },
                    {
                "long_name" = 02852;
                "short_name" = 02852;
                types =             (
                    "postal_code"
                );
            },
                    {
                "long_name" = 4308;
                "short_name" = 4308;
                types =             (
                    "postal_code_suffix"
                );
            }
        );
        "formatted_address" = "221 Juniper Drive, North Kingstown, RI 02852, USA";
        geometry =     {
            location =         {
                lat = "41.577761";
                lng = "-71.468383";
            };
            "location_type" = ROOFTOP;
            viewport =         {
                northeast =             {
                    lat = "41.5791099802915";
                    lng = "-71.46703401970849";
                };
                southwest =             {
                    lat = "41.5764120197085";
                    lng = "-71.4697319802915";
                };
            };
        };
        "place_id" = ChIJ563yzFex5YkRujoi28Fvzvo;
        types =     (
            "street_address"
        );
    },
    {
        "address_components" =     (
                    {
                "long_name" = "North Kingstown";
                "short_name" = "North Kingstown";
                types =             (
                    locality,
                    political
                );
            },
                    {
                "long_name" = "Washington County";
                "short_name" = "Washington County";
                types =             (
                    "administrative_area_level_2",
                    political
                );
            },
                    {
                "long_name" = "Rhode Island";
                "short_name" = RI;
                types =             (
                    "administrative_area_level_1",
                    political
                );
            },
                    {
                "long_name" = "United States";
                "short_name" = US;
                types =             (
                    country,
                    political
                );
            }
        );
        "formatted_address" = "North Kingstown, RI, USA";
        geometry =     {
            bounds =         {
                northeast =             {
                    lat = "41.6549521";
                    lng = "-71.4023083";
                };
                southwest =             {
                    lat = "41.497126";
                    lng = "-71.52244109999999";
                };
            };
            location =         {
                lat = "41.5568315";
                lng = "-71.4536835";
            };
            "location_type" = APPROXIMATE;
            viewport =         {
                northeast =             {
                    lat = "41.6549521";
                    lng = "-71.4023083";
                };
                southwest =             {
                    lat = "41.497126";
                    lng = "-71.52244109999999";
                };
            };
        };
        "place_id" = "ChIJgWUP-V-x5YkRO7Zie7NXWsI";
        types =     (
            locality,
            political
        );
    },2nd JSON Object, 3rd JSON Object ,......,....

My question is How to Reduce the coding ? Using NSPRedicates and KeyPath ..

enter image description here This is how can we brake the problems......I have mentioned this in @ztan's answer, please have a look, It would be beneficial.

please see my second comment.......:)

Community
  • 1
  • 1
Arpit B Parekh
  • 1,932
  • 5
  • 36
  • 57
  • Can we use NSXMLParser or any other parser to solve this complex json easily. Like a very little him shown in 'Answer of user @superGokuN' in this link http://stackoverflow.com/questions/10515639/iphone-get-city-name-from-latitude-and-longtiude – Arpit B Parekh Jul 02 '15 at 09:14
  • But frankly speaking for parsing google api, we need to analyse and parse the data accordingly, It takes my 5-6 hours to understand response, I have posted, please anybody as any API, Do not you think that we should parsing the google response logically ? – Arpit B Parekh Jul 02 '15 at 10:26

2 Answers2

1

try this

NSArray *filtered = [YOURARRAY filteredArrayUsingPredicate:
    [NSPredicate predicateWithFormat:@"(types == %@)", @"locality "]];
Stonz2
  • 6,306
  • 4
  • 44
  • 64
kb920
  • 3,039
  • 2
  • 33
  • 44
1

You can do the following:

NSArray *addressArray = resultDict[@"results"];

NSPredicate *predicateFromTypes=[NSPredicate predicateWithFormat:@"(types CONTAINS 'postal_code') AND (types CONTAINS 'locality')"];

NSLog(@"\n%@", [addressArray[0][@"address_components"] filteredArrayUsingPredicate:predicateFromTypes][0][@"long_name"]);
ztan
  • 6,861
  • 2
  • 24
  • 44