Reskit对象映射返回具有nil属性的模型对象

时间:2013-01-09 11:11:16

标签: ios restkit

我正在尝试映射RSS提要的项目。 RKObjectRequestOperation返回确切的对象数,但属性值为nil。以下是我的代码

 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];

有什么我错过的吗?

1 个答案:

答案 0 :(得分:1)

我弄明白了这个问题。问题涉及与XMLReader相关联的RKXMLReaderSerialization类。 RKObjectMapping类无法使用对象的属性映射字典的键。原因是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/";
    };
}

与上面的回复一样,每个标记都与一个字典相关联,而字典又将“text”作为一个键。

所以我将对象映射更改为

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

这解决了我的问题。