iOS中的主要线程实现

时间:2015-01-27 19:27:35

标签: ios objective-c

我在目标C(iOS)中做了一些事情但是陷入了有时只发生的崩溃。这是我的代码(在txn完成时调用的块内部。)

        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. 当我的表视图忙于重新加载第0部分时,响应再次出现,myArray的内容发生了变化,因此应用程序崩溃了。
  2. 感谢任何帮助。

    非常感谢。

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

3 个答案:

答案 0 :(得分:1)

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

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

不久之后说,你试过做类似以下的事情:
4)[myArray insertObject:newObject atIndex:0];
5)异步调度到主体 6)[self.tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:0 inSection:0]] withRowAnimation:UITableViewRowAnimationAutomatic];

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

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

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

答案 1 :(得分:0)

是的,可以再次将dispatch_async调用到主队列。但是,请记住dispatch_async的作用。由于它是异步执行的,callSomeMethod不会出现在与第一个dispatch_async调用相同的执行流中。至于你的崩溃,callSomeMethod是否需要dispatch_async到主队列?删除callSomeMethod中的dispatch_async可能会有所帮助,只需确保调用callSomeMethod的人在主线程上执行此操作。

答案 2 :(得分:0)

使用dispatch_sync从主线程同步启动主线程将暂停您的应用。使用dispatch_async对任何线程都是安全的。

如果在表格加载单元格时遇到表格数据更新问题,则必须停止发生这种情况。将您的数据存储在其他地方,只有在您完全更新后才能拨打reloadData