RestKit - 使用CoreData映射实体 - 响应错误

时间:2013-06-11 22:59:46

标签: ios restkit foursquare restkit-0.20

我正在构建一个需要实现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];
}];

核心数据模型: enter image description here enter image description here

这是我正在尝试解析的那种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;
        },

2 个答案:

答案 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"];