iOS无效的行更新异常

时间:2015-02-05 03:14:18

标签: ios objective-c multithreading uitableview

我正在制作iOS应用的短信风格组件。消息传递视图是UITableView。我想为表添加一个新行,用于发送消息和传入消息。为传入消息添加一行的调用是通过专用串行线程通过KVO实现的。类似地,通过KVO发送成功,为发送消息添加行的调用来自不同的专用串行线程。如果有来自传入消息的添加行的调用以及在接近完全相同的时间为已发送消息添加行的另一个调用,则应用程序会针对无效行引发异常:

  

'无效更新:第0节中的行数无效。更新后现有部分中包含的行数(31)必须等于更新前该部分中包含的行数(29),再加上或减去从该部分插入或删除的行数(插入1个,删除0个)以及加入或减去移入或移出该部分的行数(0移入,0移出)。'

这是线程安全问题吗?我该如何解决?以下是从两个不同的线程调用的相关方法:

-(void)addRowToMessageTable {    
    dispatch_async(dispatch_get_main_queue(), ^{
        NSIndexPath *indexPath = [NSIndexPath indexPathForRow: [_messageTable numberOfRowsInSection:0] inSection: 0];
        [_messageTable beginUpdates];
        [_messageTable insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
        [_messageTable endUpdates];
    });
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return _privateMessages.count;
}

1 个答案:

答案 0 :(得分:1)

表视图更新方法在内部再次加载表,因此它再次调用委托方法。您将获得异常,因为您已将该行添加到表中,但尚未将该对象添加到_privateMessages数组中。将相同的对象添加到数组,以便在更新之前和之后计数相同。