2012-04-18 63 views
0

我有一个tableView和一个“重新加载”按钮,从URL中获取数据并重新载入表,这是一个代价高昂的操作(特别是获取部分)。UITextView外观延迟

我想在显示信息的时候发生这种情况,所以我想我会在上面放一个“加载”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呈现在屏幕前。我知道这一点,因为我的NSLog在fetchData里面,在UITextView出现在屏幕上之前执行。

有什么明显的我在这里失踪?谢谢。

回答

1

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

然后你fetchData方法内部更换[self fetchData];,您的抓取完成后,加

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

其中新方法fetchDataFinished被定义为

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

注你必须做出textView一个属性,所以它可以在这个方法中访问。

我还没有尝试了上面你的具体情况,但我已经成功地在许多类似的情况下使用了类似的结构。