我在目标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.有多个部分 2.可以向下移动部分 3.有多个txns经常更新,我相应地更新tableview 4.当我从服务器获得响应并且更改数据源数组的内容时重新加载tableview部分
答案 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
。