显示视图后无法更改UITableView

时间:2012-07-10 17:23:57

标签: objective-c ios cocoa-touch uitableview

我有一个UINavigationController,它将自定义UITableViewController推送到堆栈上。这个推送的视图控制器,也是表视图委托和数据源,然后需要从互联网上下载所需的数据才能显示。当用户滚动到表视图的底部时,也会发生下载过程,其中新下载的数据将附加到表视图的底部。

我想通知用户正在进行此下载。问题是我尝试了很多方法,但表视图没有显示我在下载之前所做的任何更改。我已经封装了通知并下载到我的自定义UITableViewController类中的单个方法中:

- (void) extractArticlesFromURL:(NSURL) url
{   
    // 1st method - set alpha
    self.tableView.alpha = 0.2;

    // 2nd method - push an overlay while downloading
    UIViewController* overlay = [[UIViewController alloc] init];
    overlay.view.backgroundColor = [UIColor blackColor];
    [self.navigationController pushViewController:overlay animated:NO];

    // 3rd method - introduce a BOOL isLoading, which is used in data source
    // and delegate methods in an attempt to change display
    isLoading = YES;

    [self.tableView reloadData];
    [self.tableView setNeedsDisplay];

    // Spend a few seconds downloading data which is stored in an
    // array which is accessed during UITableViewDelegate method calls...

    self.tableView.alpha = 1;
    isLoading = NO;
    [self.navigationController popViewControllerAnimated:NO];

    [self.tableView reloadData];
}

我在-(void)scrollViewDidScroll: (UIScrollView*)scrollView中调用了这个特殊的方法,这肯定会被调用,因为表视图附加了新数据,但在下载过程中没有显示变化。我不介意应用程序冻结,它只是在冻结之前不会更新显示。

如果有帮助,我使用的是使用LLVM 3.1的XCode 4.3.2,并使用iPhone模拟器5.1测试功能。该应用程序的这个组件是单线程的。

2 个答案:

答案 0 :(得分:2)

您的视图被冻结,因为您需要花费大量时间来完成这些操作并且您正在主线程中运行。

解冻视图的最佳方法是使用单独的线程收集所有远程数据。当您结束加载数据时,您可以调用主控制器并告诉它更新视图(更新表,推送新控制器等)。

此外,当您开始在单独的线程中加载数据时,您可以更新主线程中的视图,即在屏幕上添加旋转轮或一些“正在加载...”消息。

答案 1 :(得分:0)

我的答案是提供提示,而不是实施。

好吧,您可以在方法中使用@synchronize方法进行异步调用,只要用户滚动tableView就可以识别tableView的最后一行,然后可以调用刷新/更新方法,只需更新数据模型或其他方法您可以在导航栏上放置一个刷新按钮以允许用户下载更多项目,否则您可以运行计时器,如果它与您的缓存模型没有差别,则只从服务器下载最新数据。您应该始终缓存数据模型。