Objective C线程和GUI更新问题

4
我正在开发一个包含TableView的iOS应用程序。某些方法从网络接收数据,打开新线程计算信息,并使用insertRowsAtIndexPaths方法在运行时向表格中插入一行。如果一次性传输了大量数据,表格可能会在几次插入后更新自身,而不是每次插入后都更新,这可能会引发异常,表示该部分的行数不正确(因为它认为应该增加一行,但线程已经插入了数据数组的更多单元格)。即使我对数据源数组和insertRowsAtIndexPaths方法进行锁定,它仍然会出现同样的问题。
NSLock *mylock = [[NSLock alloc] init];
[mylock lock];

[array addObject:object];

[tableView insertRowsAtIndexPaths:indexPath withRowAnimation:UITableViewRowAnimationLeft];

[mylock unlock];

请帮忙,

谢谢!


1
经验法则:通过在对 API 的调用周围放置锁来使 API 线程安全是不可行的。无法这样做。 - bbum
1个回答

9

你必须在主线程上运行此方法。所有用户界面交互都要在主线程上完成。

假设你的方法长这样:

- (void)addSomeObject:(id)object {
    [array addObject:object];
    [tableView insertRowsAtIndexPaths:indexPath withRowAnimation:UITableViewRowAnimationLeft];
}

你正在这样调用它:

[self addSomeObject:anObject];

那么您需要将此调用更改为以下内容:
[self performSelectorOnMainThread:@selector(addSomeObject:) withObject:anObject waitUntilDone:NO];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接