0

我有一个 tableView 和一个从 URL 获取数据并重新加载表的“重新加载”按钮,这是一个昂贵的操作(特别是 fetch 部分)。

我想在发生这种情况时向用户显示信息,所以我想我会在顶部放置一个“正在加载”的 UITextView,执行获取/重新加载操作,然后删除 UITextView。

这是代码:

- (IBAction)refreshData:(id)sender {

    UITextView *textView = [[UITextView alloc] initWithFrame:CGRectMake(0, self.view.frame.size.height-30, self.view.frame.size.width, 30)];
    [self.view addSubview:textView];
    textView.text = @"Loading..";
    textView.textColor = [UIColor whiteColor];
    textView.backgroundColor = [UIColor grayColor];
    textView.editable = NO;

    [self fetchData];
    [self.tableView reloadData];

    [textView removeFromSuperview];
}

我得到的行为是 fetchData 在 UITextView 在屏幕上呈现之前执行。我知道这一点是因为我在 fetchData 中有 NSLogs,它在 UITextView 显示在屏幕上之前执行。

我在这里有什么明显的遗漏吗?谢谢。

4

1 回答 1

1

替换[self fetchData];

[self performSelectorInBackground:@selector(fetchData) withObject:nil];

然后在您的fetchData方法中,完成获取后,添加

[self performSelectorOnMainThread:@selector(fetchDataFinished) withObject:nil waitUntilDone:NO];

其中新方法fetchDataFinished定义为

-(void) fetchDataFinished{
    [self.tableView reloadData];
    [self.textView removeFromSuperview];
}

请注意,您必须创建textView一个属性,以便在此方法中可以访问它。

对于您的特定情况,我没有尝试过上述方法,但我已经在许多类似情况下成功地使用了类似的结构。

于 2012-04-18T22:05:18.093 回答