Reskit object mapping returns model objects with nil attributes

旧巷老猫 提交于 2019-12-10 22:35:25

问题


I'm trying to map the items of the RSS feeds. The RKObjectRequestOperation returns the exact number of objects but the attributes values are nil. Following is my code

 NSURL *requestURL = [NSURL URLWithString:@"http://sports.espn.go.com/espn/rss/nfl/news"];
 [RKMIMETypeSerialization registerClass:[RKXMLReaderSerialization class] forMIMEType:@"application/rss+xml"];
RKObjectMapping *rssFeedObjectMapping = [RKObjectMapping mappingForClass:[SBRssFeed class]];
    [rssFeedObjectMapping addAttributeMappingsFromDictionary:@{
     @"title" : @"title",
     @"link" : @"link"
}];

RKResponseDescriptor *rssFeedResponseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:rssFeedObjectMapping
                                                                                              pathPattern:nil
                                                                                                  keyPath:@"rss.channel.item"
                                                                                              statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];

 RKObjectRequestOperation *requestOperation = [[RKObjectRequestOperation alloc]initWithRequest:[NSURLRequest requestWithURL:requestURL]
                                                                              responseDescriptors:@[rssFeedResponseDescriptor]];
    [requestOperation setCompletionBlockWithSuccess:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
        _datasourceArray = mappingResult.array;
        NSLog(@"Count %d", _datasourceArray.count);
        [self.tableView reloadData];
    }
                                            failure:^(RKObjectRequestOperation *operation, NSError *error) {
                                                NSLog(@"Error %@", error);
                                            }];
    [requestOperation start];

Is there something that I missed?


回答1:


I figured out the problem. The problem was regarding to the XMLReader class associated with RKXMLReaderSerialization. The RKObjectMapping class failed to map the dictionary's keys with object's properties. The reason was the output dictionary on XMLReader.

{
    rss =     {
        channel =         {
            "atom:link" =             {
                href = "http://www.nytimes.com/services/xml/rss/nyt/Baseball.xml";
                rel = self;
                type = "application/rss+xml";
            };
            copyright =             {
                text = "Copyright 2013 The New York Times Company";
            };
            description =             {
                text = Baseball;
            };
            image =             {
                link =                 {
                    text = "http://www.nytimes.com/pages/sports/baseball/index.html?partner=rss&emc=rss";
                };
                title =                 {
                    text = "NYT > Baseball";
                };
                url =                 {
                    text = "http://graphics8.nytimes.com/images/misc/NYT_logo_rss_250x40.png";
                };
            };
            item =             (
                                {
                                    "atom:link" =                     {
                                        href = "http://www.nytimes.com/2013/01/23/sports/baseball/rays-add-right-hander-with-a-new-name.html?partner=rss&emc=rss";
                                        rel = standout;
                                    };
                                    category =                     (
                                                                    {
                                                                        domain = "http://www.nytimes.com/namespaces/keywords/nyt_org_all";
                                                                        text = "Tampa Bay Rays";
                                                                    },
                                                                    {
                                                                        domain = "http://www.nytimes.com/namespaces/keywords/des";
                                                                        text = Baseball;
                                                                    }
                                                                    );
                                    "dc:creator" =                     {
                                        text = "By THE ASSOCIATED PRESS";
                                    };
                                    description =                     {
                                        text = "The Rays agreed on a minor league contract with the right-hander Juan Carlos Oviedo, who played under the fake name Leo Nunez before an eight-week suspension by Major League Baseball last year.<img width='1' height='1' src='http://rss.nytimes.com/c/34625/f/640313/s/27cc926a/mf.gif' border='0'/><br/><br/><a href=\"http://da.feedsportal.com/r/151884969355/u/82/f/640313/c/34625/s/27cc926a/a2.htm\"><img src=\"http://da.feedsportal.com/r/151884969355/u/82/f/640313/c/34625/s/27cc926a/a2.img\" border=\"0\"/></a><img width=\"1\" height=\"1\" src=\"http://pi.feedsportal.com/r/151884969355/u/82/f/640313/c/34625/s/27cc926a/a2t.img\" border=\"0\"/>";
                                    };
                                    guid =                     {
                                        isPermaLink = false;
                                        text = "http://www.nytimes.com/2013/01/23/sports/baseball/rays-add-right-hander-with-a-new-name.html";
                                    };
                                    link =                     {
                                        text = "http://www.nytimes.com/2013/01/23/sports/baseball/rays-add-right-hander-with-a-new-name.html?partner=rss&emc=rss";
                                    };
                                    pubDate =                     {
                                        text = "Wed, 23 Jan 2013 04:01:23 GMT";
                                    };
                                    title =                     {
                                        text = "Rays Add Right-Hander With a New Name";
                                    };
                                });
            language =             {
                text = "en-us";
            };
            lastBuildDate =             {
                text = "Wed, 23 Jan 2013 04:20:27 GMT";
            };
            link =             {
                text = "http://www.nytimes.com/pages/sports/baseball/index.html?partner=rss&emc=rss";
            };
            pubDate =             {
                text = "Wed, 23 Jan 2013 04:20:27 GMT";
            };
            title =             {
                text = "NYT > Baseball";
            };
            ttl =             {
                text = 2;
            };
        };
        version = "2.0";
        "xmlns:atom" = "http://www.w3.org/2005/Atom";
        "xmlns:dc" = "http://purl.org/dc/elements/1.1/";
        "xmlns:itunes" = "http://www.itunes.com/dtds/podcast-1.0.dtd";
        "xmlns:media" = "http://search.yahoo.com/mrss/";
        "xmlns:rdf" = "http://www.w3.org/1999/02/22-rdf-syntax-ns#";
        "xmlns:taxo" = "http://purl.org/rss/1.0/modules/taxonomy/";
    };
}

As in the above response, each tag is associated with a dictionary, which in turn has 'text' as a key.

So I changed the object mapping to

    RKObjectMapping *rssFeedObjectMapping = [RKObjectMapping mappingForClass:[SBRssFeed class]];
    [rssFeedObjectMapping addAttributeMappingsFromDictionary:@{
     @"title.text" : @"title",
     @"link.text" : @"link"
}];

This solved my problem.



来源:https://stackoverflow.com/questions/14233934/reskit-object-mapping-returns-model-objects-with-nil-attributes

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!