仅将20个最新项目从XML添加到NSMutableArray

时间:2013-06-29 04:09:53

标签: ios parsing uitableview nsmutablearray

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

                }                            

            }];

        }        
    }];

}

1 个答案:

答案 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个最大值并显示它们。