Google размещает API - JSON возвращает правильные данные, а затем возникает исключение

Я использую API Google Мест, JSON возвращает действительные результаты. В моих асинхронных методах я устанавливаю маркеры для каждого результата, метод завершается, и внезапно я получаю следующую нить 1: EXC_BAD_ACCESS code:2 address:0x9243e8, в окне вывода я получаю следующее: [71539:c07] -[__NSCFString CGImage]: нераспознанный селектор отправлен на экземпляр 0xb19dd10

Я понятия не имею, как отладить это, или где искать проблему, все мои параметры выглядят хорошо.

Спасибо

1 ответ

Я подозреваю, что вы делаете, как говорит комментатор, рассматривая возвращенный объект JSON как тип, которым он не является. В частности, из-за вашей ошибки вы рассматриваете строку как изображение. Как правило, JSON на самом деле не содержит изображений, поэтому при десериализации вы не получите изображения. В API Google Адресов он не отправляет вам изображения. Вместо этого он отправляет вам URL-адреса изображений. Вам нужно будет загрузить изображения, используя URL-адреса, которые вы получаете из API Адресов.

Вот код, который я использую. Этот метод получает список мест из API на основе CLLocation и возвращает его как гораздо более легко переваривается NSArray из NSDictionary объекты, каждый из которых содержит важные метаданные, относящиеся к месту:

-(NSArray*)getPlaceListForLocation:(CLLocation*)inLocation {

    NSString* requestStr = [NSString stringWithFormat:@"https://maps.googleapis.com/maps/api/place/nearbysearch/json?key=%@&location=%f,%f&radius=100&sensor=true",self.googleAPIKey,inLocation.coordinate.latitude,inLocation.coordinate.longitude];

    NSURL* requestURL = [NSURL URLWithString:requestStr];

    NSLog(@"Fetching place data with URL = %@", requestURL);

    NSData* requestData = [NSData dataWithContentsOfURL:requestURL];

    if ( nil != requestData ) {
        NSError* jsonError = nil;

        id resultsObj = [NSJSONSerialization JSONObjectWithData:requestData options:0 error:&jsonError];

        if ( nil == resultsObj ) {
            if ( nil != jsonError ) {
                NSLog(@"%@",jsonError.description);
            }

            return nil;
        }

        NSArray* itemList = [resultsObj objectForKey:@"results"];

        if ( nil == itemList || itemList.count == 0) {
            return nil;
        }

        NSMutableArray* placeList = [NSMutableArray arrayWithCapacity:itemList.count];

        for ( NSDictionary* item in itemList ) {
            NSString* name = [item objectForKey:@"name"];
            NSString* iconURL = [item objectForKey:@"icon"];
            NSString* vicinity = [item objectForKey:@"vicinity"];
            NSDictionary* geometryDict = [item objectForKey:@"geometry"];
            NSDictionary* locationDict = [geometryDict objectForKey:@"location"];

            NSMutableDictionary* itemDict = [NSMutableDictionary dictionaryWithCapacity:2];

            if ( nil != name ) {
                [itemDict setObject:name forKey:@"name"];
            }

            if (nil != iconURL ) {
                [itemDict setObject:iconURL forKey:@"iconurl"];
            }

            if ( nil != vicinity ) {
                [itemDict setObject:vicinity forKey:@"vicinity"];
            }

            if ( nil != locationDict ) {
                NSString* latitudeStr = [locationDict objectForKey:@"lat"];
                NSString* longitudeStr = [locationDict objectForKey:@"lng"];

                double latitude = [latitudeStr doubleValue];
                double longitude = [longitudeStr doubleValue];

                CLLocation* placeLoc = [[CLLocation alloc] initWithLatitude:latitude longitude:longitude];

                CLLocationDistance distance = [inLocation distanceFromLocation:placeLoc];

                [itemDict setObject:[NSNumber numberWithDouble:distance] forKey:@"distance"];
            }


            [placeList addObject:itemDict];
        }

        return placeList;
    }

    return nil;
}

Затем я отображаю их в виде таблицы, используя возвращенные NSArray в качестве источника данных. Для отображения значка я использую что-то вроде MKNetworkImageView для того, чтобы получить значок на основе URL.

Другие вопросы по тегам