我读到[_tableView reloadData]
向主队列发送消息以更新并在表视图中显示数据。基于此,我想讨论以下案例。假设另一种方法在[_tableView reloadData]
之前向主队列发送消息,在这种情况下,第二条消息会在[_tableView reloadData]
之前得到处理吗?
现在这是我的情况
假设我有两个帖子TA
和TB
,我有两个方法MethodA
和MethodB
看起来像这样
这是MethodA
- (void) MethodA
{
dispatch_async(dispatch_get_main_queue(), ^{
[Myarray addObject:@"SomeObject"];
///----------<TimeFrameA>----------------
[_tableView reloadData]
});
}
这是MethodB
- (void) MethodB
{
dispatch_async(dispatch_get_main_queue(), ^{
//Runs under the assumption the "SomeObject" has already been displayed in Tableview
//Make changes to TableView/
});
}
假设MethodB
调用ThreadB
并在TimeFRameA
期间发生。
那么在[_tableView reloadData]
之前会调用MethodB吗?
我有什么方法可以确保MethodB
仅在tableView显示更新数据时运行?
答案 0 :(得分:2)
主调度队列(与主线程关联) 是串行队列,而不是并发。因此它不可能发生 在
dispatch_async(dispatch_get_main_queue(), ^{
[Myarray addObject:@"SomeObject"];
///----------<TimeFrameA>----------------
[_tableView reloadData]
});
}
在添加对象之间的主队列上执行任何其他代码 并重新加载表视图。
调度到主队列的任何其他块都在之前执行 或者在此块之后。
答案 1 :(得分:0)
我建议您使用&#34; dispatch_group&#34;同步。
通过调用:
创建一个调度组对象dispatch_group_t group = dispatch_group_create();
在MethodA中使用:
-(void) MethodA {
dispatch_group_enter(group);
dispatch_async(dispatch_get_main_queue(), ^{
[Myarray addObject:@"SomeObject"];
///----------<TimeFrameA>----------------
[_tableView reloadData];
dispatch_group_leave();
});
}
在MethodB中等待group
完成,然后执行进一步的操作:
-(void) MethodB {
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
//Runs under the assumption the "SomeObject" has already been displayed in Tableview
//Make changes to TableView/
});
}