カスタムUITableViewControllerをスタックにプッシュするUINavigationControllerがあります。テーブルビューデリゲートおよびデータソースでもあるこのプッシュされたビューコントローラは、表示する前にインターネットから必要なデータをダウンロードする必要があります。このダウンロードプロセスは、ユーザーがテーブルビューの一番下までスクロールしたときにも発生します。この場合、新しくダウンロードされたデータがテーブルビューの一番下に追加されます。
このダウンロードが行われていることをユーザーに通知したいと思います。問題は、私が多くの方法を試したのに、ダウンロードが行われる前に行った変更がテーブルビューに表示されないことです。通知をカプセル化し、カスタム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
は、テーブルビューに新しいデータが追加されますが、ダウンロード中に表示が変更されないため、確実に呼び出されます。アプリがフリーズしてもかまいません。フリーズする前に表示が更新されないだけです。
それが役立つ場合は、LLVM3.1を使用してXCode4.3.2を使用し、iPhoneSimulator5.1で機能をテストしています。アプリケーションのこのコンポーネントはシングルスレッドです。