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.