我有一个tableView和一个“重新加载”按钮,用于从URL获取数据并重新加载表,这是一项代价高昂的操作(特别是获取部分)。
我希望在发生这种情况时向用户显示信息,所以我想我会在顶部放置一个“加载”UITextView,执行fetch / reload操作,然后删除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出现在屏幕上之前执行。
我有什么明显的遗失吗?感谢。
答案 0 :(得分: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
设为属性,以便可以通过此方法访问该属性。
我没有尝试过针对您的特定情况,但我在许多类似情况下成功使用了类似的构造。