我在 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.有多个部分 2.可以上下移动部分 3.有多个经常更新的txns,我会相应地更新tableview 4. 当我从服务器获得响应并改变数据源数组的内容时,重新加载 tableview 部分
在您更新了要执行数据更新的数据后,异步调用表更新可能很危险。
在您的示例中,您实际上是在执行以下操作:
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 |