iOS - viewDidAppear: задерживается при отображении UITableView - PullRequest
1 голос
/ 13 июля 2011

У меня странная проблема.У меня есть приложение панели вкладок, в котором я использую контроллер навигации для каждой из разных вкладок, и у каждого контроллера навигации есть свой собственный контроллер просмотра для отображения некоторого содержимого.

Когда я касаюсь вкладки, я хочувкладка должна быть немедленно загружена с представлением, и после ее загрузки (viewDidAppear:) я хочу, чтобы она загрузила некоторые данные в метод viewDidAppear:.

Чтобы проверить эту функциональность, я настроил следующий метод.Я использую NSThread для имитации выполнения некоторых длительных операций, которые должны выполняться в фоновом режиме, пока представление загружено.Затем я назначаю NSArray * test (nonatomic, retain) с некоторыми тестовыми данными и перезагружаю таблицу.

Я перезагружаю таблицу, потому что в методе 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: method. Но вместо этого поведение при нажатии этой вкладки ждет 10 секунд , а затем отображаетпросмотр с заполненными данными таблицы.

Ответы [ 4 ]

1 голос
/ 13 июля 2011

Другие ответы объясняют, почему ваш основной поток блокируется при использовании метода +[NSThread sleepForTimeInterval:].

Для обработки загрузки из Интернета следует перенести задачу загрузки в фоновый поток, чтобы избежать блокировкиОсновная тема, как вы сделали здесь.Вы можете достичь этого, используя Grand Central Dispatch .

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];
   });
});
1 голос
/ 13 июля 2011

Вызов [NSThread sleepForTimeInterval:10]; не позволит основному потоку делать какие-либо обновления, поэтому вы не увидите изменений в пользовательском интерфейсе. Если вы хотите отложить перезагрузку данных таблицы, как указано выше, отметьте NSObject performSelector:withObject:afterDelay: Ссылка класса NSObject

Поместите код для reloadData и настройки массива в метод и вызовите его через performSelector:withObject:afterDelay:

0 голосов
/ 13 июля 2011
    -(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];


    }
0 голосов
/ 13 июля 2011

Разве вы не кладете не ту нить спать? (А именно тот, который создаст массив)

Кажется, вы подождали 10 секунд, а затем вызвали таблицу reloadData.

Почему ты все равно ждешь? Разве вы не хотите, чтобы tableView был заполнен, как только будут доступны данные?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...