我正在尝试映射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];
有什么我错过的吗?
答案 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"
}];
这解决了我的问题。