Objective C 线程和 GUI 更新问题

发布于 2024-11-07 12:28:45 字数 531 浏览 3 评论 0原文

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

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

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

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

[array addObject:object];

[tableView insertRowsAtIndexPaths:indexPath withRowAnimation:UITableViewRowAnimationLeft];

[mylock unlock];

请帮忙,

谢谢!

I'm developing an iOS app with a view containing a TableView.
Some method receives data from the web, opens a new thread to calculate information and inserts a row into the table at run time with the method: insertRowsAtIndexPaths.

Now if a lot of data is coming at once, the table may update itself after a few insertions and not after each one, and thats provokes an exception saying that the number of rows in section isn't right (that's because it thinks it should have an increment of one row but the threads already inserted the array of data some more cells).

Even if I make a lock on the insertion to the datasource array and the insertRowsAtIndexPaths method, it's still do the same.

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

[array addObject:object];

[tableView insertRowsAtIndexPaths:indexPath withRowAnimation:UITableViewRowAnimationLeft];

[mylock unlock];

help please,

Thank you!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

青春如此纠结 2024-11-14 12:28:45

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

假设您的方法如下所示:

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

并且您这样调用它:

[self addSomeObject:anObject];

那么您可以将此调用更改为如下所示:

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

you have to run this method on the main thread. All User Interface interaction has to be done on the main thread.

Let's say your method looks like this:

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

and you are calling it like this:

[self addSomeObject:anObject];

then you would change this call to something like this:

[self performSelectorOnMainThread:@selector(addSomeObject:) withObject:anObject waitUntilDone:NO];
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文