1

私は奇妙な問題を抱えています。タブバーアプリケーションがあり、さまざまなタブごとにナビゲーションコントローラーを使用しています。各ナビゲーションコントローラーには、コンテンツを表示するための独自のビューコントローラーがあります。

タブをタッチすると、そのタブがビューとともにすぐに読み込まれ、読み込まれた後に(viewDidAppear:)viewDidAppear:メソッドにデータをダウンロードする必要があります。

この機能をテストするために、次のメソッドを設定しました。NSThreadビューがロードされている間にバックグラウンドで実行する必要がある長い操作の実行をシミュレートするためにを使用しています。次に、NSArray * test(nonatomic、retain)にいくつかのテストデータを割り当て、テーブルをリロードします。

メソッドで空の文字列を1つだけ含むようにテーブルを設定しているため、テーブルをリロードしていviewDidLoadます(これは、viewDidAppear:が呼び出される前にテーブルがセットアップされていることを読み取ったためです。

- (void)viewDidAppear:(BOOL)animated {

    [super viewDidAppear:animated];

    DLog(@"viewDidAppear running");

    [NSThread sleepForTimeInterval:10];

    NSArray *array = [[NSArray alloc] initWithObjects:@"Test1", @"Test2", @"Test3", @"Test4", @"Test5", @"Test6", nil];
    self.test = array;

    [array release];

    [table reloadData];
}

したがって、私の予想される動作は、この特定のタブに触れるとすぐに読み込まれ、10秒後にviewDidAppear:メソッドからのテーブルデータが入力されるはずです。ただし、この動作では、このタブに触れると10秒間待機してから、テーブルデータが入力されたビューが表示されます。

4

4 に答える 4

1

呼び出す[NSThread sleepForTimeInterval:10];と、メインスレッドが更新を実行できなくなるため、ユーザーインターフェイスの変更を確認できなくなります。上記のようにテーブルデータのリロードを遅らせたい場合は、NSObject performSelector:withObject:afterDelay: NSObjectクラスリファレンスを確認してください。

reloadDataと配列設定のコードをメソッドに入れて呼び出しますperformSelector:withObject:afterDelay:

于 2011-07-13T11:09:50.607 に答える
1

他の回答は、メソッドを使用するときにメインスレッドがブロックされる理由を説明しています+[NSThread sleepForTimeInterval:]

Webからのダウンロードを処理するには、ここで行ったようにメインスレッドがブロックされないように、ダウンロードタスクをバックグラウンドスレッドにプッシュする必要があります。これは、 GrandCentralDispatchを使用して実現できます。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, NULL), ^{
    /* Download stuff */

   dispatch_async(dispatch_get_main_queue(), ^{
       /* Send UI updates back to the main thread. */
       [self.tableView reloadData];
   });
});
于 2011-07-13T11:38:42.903 に答える
0

間違ったスレッドをスリープ状態にしませんか?(つまり、アレイを作成するもの)

10秒待ってから、テーブルreloadDataを呼び出すようです。

なんで待ってるの?データが利用可能になり次第、tableViewがいっぱいになりませんか?

于 2011-07-13T10:58:54.083 に答える
0
    -(void)executeMe{


        NSArray *array = [[NSArray alloc] initWithObjects:@"Test1", @"Test2", @"Test3", @"Test4", @"Test5", @"Test6", nil];
        self.test = array;

        [array release];



        [table reloadData];



    }







    - (void)viewDidAppear:(BOOL)animated {

        [super viewDidAppear:animated];

        DLog(@"viewDidAppear running");



        [self performSelector:@selector(executeMe) withObject:nil afterDelay:10];


    }
于 2011-07-13T11:00:59.967 に答える