OStack程序员社区-中国程序员成长平台

标题: ios - iOS 中的主线程实现 [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-13 05:01
标题: ios - iOS 中的主线程实现

我在 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/






欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) Powered by Discuz! X3.4