在目标c中按顺序执行块代码

时间:2013-12-04 11:39:22

标签: ios objective-c uitableview

我尝试从服务器加载UITableView的数据源,可能需要几秒钟。我的问题在数据源和UITableView内容之间是异步的,当然我得到了一个例外。

[self loadingDataSource]; //could take few second
[self.tableView reloadData];

上面代码的结果是空白屏幕。我发现当我在第一个语句中加载DataSource时,第二个语句没有等待第一个完成并在加载数据源之前执行。所以我尝试使用GCD来解决

int64_t delayInSeconds = 0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
    [self loadingDataSource]; //could take few second
    [self.tableView reloadData];
});

但它仍然不起作用......

我找到了一些其他方法,例如,使用Dispatch Semaphores等待Loading DataSource语句完成,然后执行下一个语句。但我不知道,它是否适合我的情况。

dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
你可以帮帮我吗? TKS。

2 个答案:

答案 0 :(得分:2)

你可以尝试类似的东西,

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    // switch to a background thread and perform your expensive operation
   [self loadingDataSource]; 
    dispatch_async(dispatch_get_main_queue(), ^{
        // switch back to the main thread to update your UI
     [self.tableView reloadData];

    });
});

答案 1 :(得分:2)

您可以在loadingDataSource方法中添加完成块。

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self loadingDataSource:^{
        [self.tableView reloadData];
    }];
}

- (void)loadingDataSource:(void (^)(void))completion
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        // Load data source
        if (completion)
        {
            dispatch_async(dispatch_get_main_queue(), completion);
        }
    });
}