在NSXMLParser方法中为UITableView调用reloadData didFinishElement无效

时间:2017-05-17 00:13:48

标签: ios objective-c iphone uitableview nsxmlparser

每次在XML文件中解析元素时,我都会尝试更新单元格UITableView列表。

我尝试通过在UITableViewController中运行以下代码来实现:

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
        if ([elementName isEqualToString:@"item"]) {
            [self.tableView reloadData];
        }
    }

    - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
    {
        if (!([string isEqualToString:@"\n  "] || [string isEqualToString:@"\n"])) {
            [_idArray addObject:string];
        }
    }

使用断点我可以看到在每个元素完成后调用行[self.tableview reloadData]。但是,tableview不会使用正确的文本进行更新。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];
    // Configure the cell...
    if (_idArray.count > 0) {
        [cell.detailTextLabel setText:[_idArray objectAtIndex:indexPath.row]];
    }

    return cell;
}

我将numberofrowsinsection设为_idArray.count,将numberofsectionsintableview设为1

TableView已正确设置为此文件中的委托和数据源

如果我在每个sleep(1)之后添加reloadData,它会等待一秒钟并且NSLog正确,但不会重新加载实际的表格。

当整个文件完成解析后,它们都会突然显示出来。

如何以正确的方式逐步显示它们?

1 个答案:

答案 0 :(得分:1)

试试这个 - 在主队列GCD(Grand Central Dispatch)中包装reloadData

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
        if ([elementName isEqualToString:@"item"]) {
           dispatch_async(dispatch_get_main_queue(), ^{
              [self.tableView reloadData];
           }
        }
}