0

我有一个 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];
}

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

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

4

2 回答 2

2

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

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

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

于 2012-07-10T17:31:03.103 回答
0

我的回答只是给出提示,而不是关于实施。

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

于 2012-07-10T19:45:11.290 回答