在Realm中存储来自API的数据

时间:2016-07-05 15:26:18

标签: ios objective-c realm

我是Realm的新手。现在我有一个简单的应用程序从api中提取新闻文章。第一个视图控制器显示文章标题列表,第二个视图控制器显示从tableView中的webView中选择的文章。

我想使用Realm来存储来自API的数据,因此即使没有互联网连接,tableView也会显示结果。

我看到使用Mantle的教程,但我没有尝试这样做。

这是我到目前为止所尝试过的,但是我使用valueForKey使应用程序崩溃了,所以我对它进行了评论。

- (void)startParsing
{
    NSXMLParser *xmlparser = [[NSXMLParser alloc] initWithContentsOfURL:[NSURL URLWithString:@"http://images.apple.com/main/rss/hotnews/hotnews.rss#sthash.TyhRD7Zy.dpuf"]];
    [xmlparser setDelegate:self];
    [xmlparser parse];
    if (_marrXMLDataCollection.count != 0) {

        Data *dataRealm = [[Data alloc] init];
        dataRealm.titleR = @"Temporary title";
//        dataRealm.titleR = [_marrXMLDataCollection valueForKey:@"title"];

        RLMRealm *realm = [RLMRealm defaultRealm];
        [realm beginWriteTransaction];
        [realm addObject:dataRealm];
        [realm commitWriteTransaction];

        [self.collectionView reloadData];
    }
}

任何想法都会很棒,谢谢!

如果需要,可以在此处获取更多信息:

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict;
{
    if ([elementName isEqualToString:@"rss"]) {
        _marrXMLDataCollection = [[NSMutableArray alloc] init];
    }
    if ([elementName isEqualToString:@"item"]) {
        _mdictXMLPartCollection = [[NSMutableDictionary alloc] init];
    }
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string;
{
    if (!_mstrXMLStringCollection) {
        _mstrXMLStringCollection = [[NSMutableString alloc] initWithString:string];
    }
    else {
        [_mstrXMLStringCollection appendString:string];
    }
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName;
{
    if ([elementName isEqualToString:@"title"]
        || [elementName isEqualToString:@"pubDate"]
        || [elementName isEqualToString:@"link"]

        ) {
        [_mdictXMLPartCollection setObject:_mstrXMLStringCollection forKey:elementName];
    }
    if ([elementName isEqualToString:@"item"]) {
        [_marrXMLDataCollection addObject:_mdictXMLPartCollection];
    }
    _mstrXMLStringCollection = nil;
}

1 个答案:

答案 0 :(得分:1)

我猜你所看到的是关于整合Realm和Mantle的this article on the Realm website

绝对没有必要将Realm与任何第三方解析库一起使用。在该文章中,Mantle的观点是更容易将来自REST API的JSON响应转换为模型对象(包括过程中的日期字符串到NSDate之类的东西),然后可以将其移交给Realm对象

您的Realm代码在这里看起来是正确的(假设Date已正确地成为RLMObject的子类),因此您的XML解析代码会出现问题。 NSXMLParser是一个相当棘手的类,因为它要求您通过委托回调顺序构建XML数据图。

为了解析从API提供的XML(即,它本身就是小的,离散的块。NSXMLParser是为非常庞大的XML数据集而设计的。),我会改为建议使用另一个XML库,该库经过并处理整个XML集,然后再发送给您。我之前已经在发送应用中使用了TBXML,并且a Ray Wenderlich article讨论了更多这些内容(当然,此时它已经过时了)

如果有其他人知道推荐的更新的XML库,请加入。:)