2013-01-09 45 views
2

我試圖映射RSS源的項目。 RKObjectRequestOperation返回確切的對象數量,但屬性值爲零。以下是我的代碼Reskit對象映射返回具有零屬性的模型對象

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

您能否提供來自服務器的示例響應? – Alex

+0

我試圖在這裏做同樣的事情,任何方式你可以看看?謝謝!! http://stackoverflow.com/questions/25675839/rkvaluetransformers-failed-transformation-of-value-to-nsdate?noredirect=1#comment40162652_25675839 – 2014-09-06 00:35:35

回答

1

我想通了這個問題。問題是關於與RKXMLReaderSerialization關聯的XMLReader類。 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/"; 
    }; 
} 

就像在上面的回答中一樣,每個標籤都與一個字典相關聯,字典又有一個「文本」作爲關鍵字。

所以我改變了對象映射到

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

這解決了我的問題。

+0

是來自ESPN RSS pubDate NSDate或NSString?這對我來說非常有幫助,謝謝 – 2014-09-06 00:16:34