0

カスタム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で機能をテストしています。アプリケーションのこのコンポーネントはシングルスレッドです。

4

2 に答える 2

2

これらのアクションを完了するのに多くの時間がかかり、メインスレッドで実行しているため、ビューがフリーズします。

ビューのフリーズを解除する最良の方法は、別のスレッドを使用してすべてのリモートデータを収集することです。データのロードが終了したら、メインコントローラーを呼び出して、ビューを更新するように指示します(テーブルの更新、新しいコントローラーのプッシュなど)。

また、別のスレッドでデータの読み込みを開始すると、メインスレッドのビューを更新できます。つまり、画面にスピニングホイールまたは「読み込み中...」メッセージを追加できます。

于 2012-07-10T17:31:03.103 に答える
0

私の答えは、実装についてではなく、ヒントを与えることです。

非同期呼び出しのメソッドで@synchronizeメソッドを使用できます。また、ユーザーがtableViewをスクロールするたびに、tableViewの最後の行を識別できます。次に、データモデルを更新するだけのrefresh / updateメソッドを呼び出すか、次のように配置できます。ナビゲーションバーの1つの更新ボタンを使用して、ユーザーがより多くのアイテムをダウンロードできるようにします。または、キャッシュモデルと変わらない場合は、サーバーから最新のデータをダウンロードするタイマーを実行できます。常にデータモデルをキャッシュする必要があります。

于 2012-07-10T19:45:11.290 に答える