我正在构建一个需要实现Foursquare搜索结果的iOS应用。 我正在使用RestKit,但仍然遇到同样的错误: “没有响应描述符匹配加载的响应”
这是我的代码的相关部分:
RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:[NSURL URLWithString:@"https://api.foursquare.com/v2"]];
objectManager.managedObjectStore = managedObjectStore;
[RKObjectManager setSharedManager:objectManager];
RKEntityMapping *entityMapping = [RKEntityMapping mappingForEntityForName:@"Venue" inManagedObjectStore:managedObjectStore];
[entityMapping addAttributeMappingsFromDictionary:@{
@"name": @"name",
@"id": @"id",
@"canonicalUrl": @"canonicalUrl"}];
entityMapping.identificationAttributes = @[@"id"];
RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor
responseDescriptorWithMapping:entityMapping
pathPattern:@"/v2/venues/search"
keyPath:nil
statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
[objectManager addResponseDescriptor:responseDescriptor];
//Create strings for auth
clientID = [NSString stringWithUTF8String:kCLIENTID];
clientSecret = [NSString stringWithUTF8String:kCLIENTSECRET];
[self loadVenues];
loadVenues方法:
NSString *currentLatLon = [NSString stringWithFormat:@"%1$f,%2$f", locationManager.location.coordinate.latitude, locationManager.location.coordinate.longitude];
NSDictionary *queryParams = [NSDictionary dictionaryWithObjectsAndKeys:
@"20130601",@"v",
currentLatLon,@"ll",
clientID,@"client_id",
clientSecret,@"client_secret", nil];
[[RKObjectManager sharedManager]
getObjectsAtPath:@"https://api.foursquare.com/v2/venues/search"
parameters:queryParams
success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
//Do something
}
failure:^(RKObjectRequestOperation *operation, NSError *error) {
//Do something else
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"An Error Has Occurred" message:[error localizedDescription] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alertView show];
}];
核心数据模型:
这是我正在尝试解析的那种JSON数据:
representation: {
meta = {
code = 200;
};
response = {
venues = (
{
canonicalUrl = "https://foursquare.com/v/union-square/40bbc700f964a520b1001fe3";
categories = (
{
icon = {
prefix = "https://foursquare.com/img/categories_v2/parks_outdoors/plaza_";
suffix = ".png";
};
id = 4bf58dd8d48988d164941735;
name = Plaza;
pluralName = Plazas;
primary = 1;
shortName = "Plaza / Square";
}
);
contact = {
formattedPhone = "(415) 781-7880";
phone = 4157817880;
twitter = unionsquaresf;
};
hereNow = {
count = 8;
groups = (
{
count = 8;
items = (
);
name = "Other people here";
type = others;
}
);
};
id = 40bbc700f964a520b1001fe3;
location = {
address = "Union Square Park";
cc = US;
city = "San Francisco";
country = "United States";
crossStreet = "btwn Post, Stockton, Geary & Powell St.";
distance = 68;
lat = "37.787750172585";
lng = "-122.4076282253645";
postalCode = 94108;
state = CA;
};
name = "Union Square";
referralId = "v-1370991275";
restricted = 1;
specials = {
count = 0;
items = (
);
};
stats = {
checkinsCount = 73242;
tipCount = 172;
usersCount = 39007;
};
url = "http://visitunionsquaresf.com";
venuePage = {
id = 34303229;
};
verified = 1;
},
答案 0 :(得分:2)
当你进行调用以获取数据时,请使用相对路径,而不是完整的URL:
[[RKObjectManager sharedManager] getObjectsAtPath:@"venues/search" ...
同样,您的响应描述符路径模式应匹配:
RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor
responseDescriptorWithMapping:entityMapping
pathPattern:@"venues/search" ...
答案 1 :(得分:0)
这是我在看完Wain的建议后想出来的。
在运行时,RestKit找不到我的responseDescriptor。 这是我改变以获得我的responseDescriptor认可的内容:
RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor
responseDescriptorWithMapping:entityMapping
pathPattern:nil
keyPath:@"response.venues"
statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
更改后并确保我使用正确的路径(总是仔细检查你的路径!),我注意到我的密钥没有正确映射。
问题是我在实体模型中将我的一个键命名为“id”。 “id”是一个系统关键字,导致了一大堆时髦的编译器错误。
我只需要回到我的数据模型并调整我的属性。
RKEntityMapping *entityMapping = [RKEntityMapping mappingForEntityForName:@"Venue" inManagedObjectStore:managedObjectStore];
[entityMapping addAttributeMappingsFromDictionary:@{
@"name": @"name",
@"id": @"venueID",
@"canonicalUrl": @"canonicalUrl"}];
entityMapping.identificationAttributes = @[@"venueID"];