gpt4 book ai didi

ios - objective-C : Why does my app not perform any animations and do wonky unexpected things when I open up my app occasionally?

转载 作者:行者123 更新时间:2023-11-28 19:46:02 24 4
gpt4 key购买 nike

所以这很难解释,但是......有时当我打开我的应用程序时,它只是忽略所有动画并执行“动画 block ”而不是动画,所以它会立即为通过整个应用程序。我对为什么会发生这种情况感到困惑,因为其他时候当我打开该应用程序时,它运行得非常好,但有时当我打开该应用程序时它只是在我面前爆炸并忽略所有动画。

当我添加这行代码时问题开始了:

[weakSelf.tableView performSelectorInBackground:@selector(reloadData) withObject:nil];

有人可以帮忙解释为什么会这样吗?

最佳答案

这行代码:

[weakSelf.tableView performSelectorInBackground:@selector(reloadData) withObject:nil];

保证以不可预知的方式“爆炸”。

引用 performSelectorInBackground: 的文档:

creates a new thread in your application, putting your application into multithreaded mode if it was not already. The method represented by aSelector must set up the thread environment just as you would for any other new thread in your program.

reloadData 方法不会“设置线程环境”,因此如果您执行它会搞砸。

另外,引用reloadData的文档:

Marks the table view as needing redisplay, so it will reload the data for visible cells and draw the new values.

请注意我以粗体突出显示的部分。绘制到屏幕必须发生在主线程上,否则一切都会搞砸。在后台线程上绘制屏幕是不可靠的,不应这样做。

这部分特别糟糕,因为根据其他线程中发生的情况,从后台线程中绘制通常会工作但通常它不会工作,你会看到这种情况您描述的问题。

因此,要修复您的代码,请更改这行代码:

[weakSelf.tableView performSelectorInBackground:@selector(reloadData) withObject:nil];

对此:

dispatch_async(dispatch_get_main_queue(), ^(void){
[weakSelf.tableView reloadData];
});

这样 reloadData 操作将在主线程(也称为队列)上执行,一切都应该很好。

关于ios - objective-C : Why does my app not perform any animations and do wonky unexpected things when I open up my app occasionally?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32063275/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com