在这种情况下,Tableview的reloadData是否立即执行

时间:2015-04-24 20:37:34

标签: ios objective-c uitableview

我读到[_tableView reloadData]向主队列发送消息以更新并在表视图中显示数据。基于此,我想讨论以下案例。假设另一种方法在[_tableView reloadData]之前向主队列发送消息,在这种情况下,第二条消息会在[_tableView reloadData]之前得到处理吗?

现在这是我的情况

假设我有两个帖子TATB,我有两个方法MethodAMethodB看起来像这样

这是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显示更新数据时运行?

2 个答案:

答案 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/
    });
}