objective-c - Objective C 线程和 GUI 更新问题

标签 objective-c multithreading ios uitableview thread-safety

我正在开发一个 iOS 应用程序,其 View 包含一个 TableView。 一些方法从网络接收数据,打开一个新线程来计算信息并在运行时使用以下方法将一行插入表中:insertRowsAtIndexPaths

现在,如果大量数据同时出现,表格可能会在几次插入后自行更新,而不是在每次插入后更新,这会引发一个异常,说明 section 中的行数不正确(那是因为它认为它应该有一行的增量,但线程已经插入了数据数组更多的单元格)。

即使我锁定了数据源数组的插入和 insertRowsAtIndexPaths 方法,它仍然执行相同的操作。

NSLock *mylock = [[NSLock alloc] init];
[mylock lock];

[array addObject:object];

[tableView insertRowsAtIndexPaths:indexPath withRowAnimation:UITableViewRowAnimationLeft];

[mylock unlock];

请帮忙,

谢谢!

最佳答案

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

假设您的方法如下所示:

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

你是这样调用它的:

[self addSomeObject:anObject];

然后你会把这个调用改成这样:

[self performSelectorOnMainThread:@selector(addSomeObject:) withObject:anObject waitUntilDone:NO];

关于objective-c - Objective C 线程和 GUI 更新问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6009455/

相关文章:

iphone - ASIHTTPRequest调试

java - 快速 Java 匿名函数/类问题

ios - 使用 Parse 在用户注册时添加个人资料图片 - iOS

用于向 App Store 分发应用程序的 iOS 公司名称

objective-c - 如何获取 self.navigationItem.title 的值并设置为新变量?

iphone - 检查 Controller 是否在导航 Controller 堆栈的顶部

ios - StoryBoard 找不到 ViewController

Java线程内存计算

java - 使用连续线程时 JVM 无缘无故关闭

ios - React Native - Navigator 递归子项崩溃