我正在解析一个相当大的XML文件,并将每个项目放在tableview上的单元格中。在我解析xml之后,它将所有项添加到NSMutableArray,然后根据数组的计数添加行数。如何设置它以便只将20个最新项目添加到阵列中,这样加载时间不会太长?解析完成后的代码是:
- (void)requestFinished:(ASIHTTPRequest *)request {
[_queue addOperationWithBlock:^{
NSError *error;
GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:[request responseData]
options:0 error:&error];
if (doc == nil) {
NSLog(@"Failed to parse %@", request.url);
} else {
NSMutableArray *entries = [NSMutableArray array];
[self parseFeed:doc.rootElement entries:entries];
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
for (RSSEntry *entry in entries) {
int insertIdx = [_allEntries indexForInsertingObject:entry sortedUsingBlock:^(id a, id b) {
RSSEntry *entry1 = (RSSEntry *) a;
RSSEntry *entry2 = (RSSEntry *) b;
return [entry1.articleDate compare:entry2.articleDate];
}];
[_allEntries insertObject:entry atIndex:insertIdx];
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:insertIdx inSection:0]]
withRowAnimation:UITableViewRowAnimationRight];
}
}];
}
}];
}
答案 0 :(得分:1)
首先,一次添加所有新行会不会有帮助?只需将它们全部添加到_allEntries数组然后重新加载数据而不是将每一行单独添加到tableview中?这可能会让事情变慢,特别是因为你做了动画。
对排序最近的20个条目进行排序,您需要一种方法对条目进行排序,一旦排序,只需计算您添加的条目,并在达到20时从for循环中断。例如:
int newCounter = 0;
for (RSSEntry *entry in entries) {
newCounter++;
int insertIdx = [_allEntries indexForInsertingObject:entry sortedUsingBlock:^(id a, id b) {
RSSEntry *entry1 = (RSSEntry *) a;
RSSEntry *entry2 = (RSSEntry *) b;
return [entry1.articleDate compare:entry2.articleDate];
}];
[_allEntries insertObject:entry atIndex:insertIdx];
//new code
if(newCounter >19)
break;
}
[self.tableview reloadData];
我确信还有其他方法可以做到这一点,但afaik这应该做的工作。你也可以在tableViewController中处理它。在numberOfRows函数中,如果数组较长,则可以限制为20。然后你仍然拥有数组中的所有条目,但你只显示20,在上面的例子中,你只在数组中存储20个最大值并显示它们。