• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - iOS 中的主线程实现

[复制链接]
菜鸟教程小白 发表于 2022-12-13 05:01:28 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我在 Objective C (iOS) 中做一些事情,但陷入了有时只会发生的崩溃。这是我的代码(在 txn 完成时被调用的 block 内)。

        dispatch_async(dispatch_get_main_queue(), ^{
        //array which is used to show table view rows
        //someOtherArray is array which has data from response of a txn
        myArray = [[NSMutableArray alloc] initWithArray:someOtherArray] ;
        [self callSomeMethod] ;
    }) ;

callSomeMethod 如下

- (void) callSomeMethod`{
dispatch_async(dispatch_get_main_queue(), ^{
    //reload tableview here
    [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationAutomatic] ;
}) ;
}

我的问题: 1. 在主线程中调用 mainThread 可以吗,因为这里我正在调用方法 callSomeMethod 并且我在该方法中设置了另一个主线程?

  1. 当我的 TableView 忙于重新加载第 0 节时,响应再次出现,并且 myArray 的内容发生了更改,因此应用程序崩溃了。

感谢任何帮助。

非常感谢。

编辑: 我的确切要求是。 1.有多个部分 2.可以上下移动部分 3.有多个经常更新的txns,我会相应地更新tableview 4. 当我从服务器获得响应并改变数据源数组的内容时,重新加载 tableview 部分



Best Answer-推荐答案


在您更新了要执行数据更新的数据后,异步调用表更新可能很危险。

在您的示例中,您实际上是在执行以下操作:
1) myArray = [[NSMutableArray alloc] initWithArray:someOtherArray];
2) 异步调度到 main
3) [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationAutomatic];

说不久之后,您尝试执行以下操作:
4) [myArray insertObject:newObject atIndex:0];
5) 异步调度到 main
6) [self.tableView insertRowsAtIndexPaths[[NSIndexPath indexPathForRow:0 inSection:0]] withRowAnimation:UITableViewRowAnimationAutomatic];

在上面的例子中,你需要 3) 发生在 1) 之后,而不是 4) 之后。如果 3) 发生在 4) 之后,3) 的刷新将导致您想要的刷新,以及行插入。然后点击 6) 时,它将尝试插入已经插入的行,应用程序将崩溃。

由于您的异步调度在 2) 和 5) 上,可能会发生上述情况,其中 3) 可以在 4) 之后被调用。

要解决此问题,请摆脱数据更新和表刷新之间的异步调度。在上面的示例中,这将涉及删除 2) 以及它的任何其他类似实例,例如 5)。

关于ios - iOS 中的主线程实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28178436/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap