0

我正在解析一个相当大的 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];

                }                            

            }];

        }        
    }];

}
4

1 回答 1

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 并显示它们。

于 2013-06-29T04:51:30.583 回答