如何使用 RaptureXML 和 AFNetworking 在 UITableView 上动态显示 XML 的解析内容?

Posted

技术标签:

【中文标题】如何使用 RaptureXML 和 AFNetworking 在 UITableView 上动态显示 XML 的解析内容?【英文标题】:How to dynamically display parsed contents of XML on UITableView using RaptureXML and AFNetworking? 【发布时间】:2013-04-19 14:17:07 【问题描述】:

我正在使用RaptureXML 和包装器AFRaptureXMLRequestOperation,它集成了AFNetworkingRaptureXML

下面的代码运行良好。一切正常,下载、解析和显示UITableView 中的内容。

当我在后台进行下载和解析时,我更新了Main Thread 上的UITableView异步

唯一的问题是 UITableView 的内容只有在 XML 的所有元素都被解析并插入到适当的NSMutableArrays 之后才会显示,这有时需要一段时间。

我的问题

有没有办法动态地显示UITableView 的内容,同时它们正在被下载和解析并且NSMutableArrays 正在被数据填充,例如使用来自 Twitter 的 JASON 文件的示例?

有代码:

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^

       [self downloadParsePlayListXML];

    dispatch_async(dispatch_get_main_queue(), ^
        [self.tableView reloadData];
    );
);

- (void)downloadParsePlayListXML 

NSString *url = @"http://example.net/playlist/xmlfiles/playlist.xml";
AFRaptureXMLRequestOperation *operation = [AFRaptureXMLRequestOperation XMLParserRequestOperationWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:url]] success:^(NSURLRequest *request, NSHTTPURLResponse *response, RXMLElement *XMLElement) 

    [XMLElement iterateWithRootXPath:@"//program" usingBlock: ^(RXMLElement *program) 

        [self.programs addObject:[program attribute:@"name"]];
        [self.speakers addObject:[program child:@"speaker"].text];


    ];
 failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, RXMLElement *XMLElement) 
    // Handle Error
];

[operation start]; 

非常感谢您的帮助!

【问题讨论】:

【参考方案1】:

直到今天晚些时候我才能对此进行测试,但我会尝试一下。注意:我对 RaptureXML 不熟悉。

首先,请参阅几天前有关解析 XML 的这篇文章。 https://***.com/a/16047964/1710611

然后,在解析过程中,每次到达元素末尾时,您都会将其添加到数组中(作为UITableView 数据源)并刷新表格。

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 
    if ([elementName isEqualToString:@"YOURTAG"]) 
        // finished getting the data in <YOURTAG>

        // do something now that you've got your data retrieved
        if (self.currentProperty) 
            [YOURDATASOURCEARRAY addObject:self.currentProperty];
            [tableView reloadData];
        
      

或者,您也可以尝试将[tableView reloadData] 替换为:

[tableView beginUpdates];
[tableView insertRowsAtIndexPaths:YOURINDEXPATHARRAY withRowAnimation:YOURANIMATION];
[tableView endUpdates];

【讨论】:

谢谢 rog,我试试看结果告诉你:-) 祝你好运!如果有任何问题,我会在下午晚些时候尽我所能提供帮助。我没有考虑在它解析时动态更新它,所以我急于回家并在我的应用程序中尝试这个。 太棒了!如果愿意,请使用 RaptureXML、AFNetworking 和 AFRaptureXMLRequestOperation(Github 上提供的三个很棒的库)尝试上述代码。非常感谢! 抱歉,我没有早点回复你。我看到您现在已将答案标记为正确 - 那么您的问题解决了吗? 嘿,罗格,感谢您回复我。实际上解决方案很简单:我使用了你的代码,但首先我用一些虚拟数据填充了数组,然后我首先显示了 tableview。我没有显示,因为在第一时间数组计数为零。这不是最优雅的解决方案,但它正在工作。如果您偶然发现了更好的方法来做到这一点,请告诉我,好吗?非常感谢你帮助我:-)

以上是关于如何使用 RaptureXML 和 AFNetworking 在 UITableView 上动态显示 XML 的解析内容?的主要内容,如果未能解决你的问题,请参考以下文章

行计数使用 RaptureXML 返回不正确的数字

RaptureXML 无法访问子标签

如何在 iOS 中使用 NSDictionary 添加图像并使用 POST 方法将数组列表发送到服务器

UITableView 重新加载时闪烁

使用 SDWebImage 而不是 AFNetworking 进行图像加载有很大的优势吗?

AFNetworking 中“setImageWithURLRequest:placeholderImage:success:”的 Alamofire 方式