Табличное представление TableViewController не отображается, пока данные не загружены - PullRequest
1 голос
/ 26 мая 2011

У меня странная проблема.У меня есть метод, который заполняет массив некоторыми данными (fetchData) (на самом деле довольно много, и это немного медленно).Я использую массив для построения строк таблицы.

Я пытался вызывать fetchData в нескольких местах моего кода, в разное время при построении представления, и мне всегда кажется, что я получаю следующее: черный экран, который отображается, пока данные измассив загружен.Я вызвал fetchData из следующих файлов:

  • (void) viewDidLoad;
  • (void) viewWillAppear: (BOOL) animated;
  • (void) viewDidAppear:(BOOL) animated;

Поскольку я использую контроллер вида навигации, приложение, которое кажется зависшим, выглядит довольно плохо, так как оно застревает на черном экране.Я надеялся, что мой код достигнет отображения пустой таблицы с индикатором прогресса до загрузки данных, а затем обновления.К сожалению, я не захожу так далеко, так как представление не загружается независимо от того, где я вызываю fetchData.

Помощь оценена!

PS Чтобы обойти эту проблему, я даже пытался использовать TTTableViewController, но представление Загрузка никогда не отображается.Типичный. Вздох

Ответы [ 3 ]

2 голосов
/ 26 мая 2011

Ваш метод загрузки должен блокировать пользовательский интерфейс.Вы должны переместить его в другой поток и позволить загрузке данных туда.Вы можете создать поток в viewDidLoad.

Это скелетный код, который вам нужен (с помощью GCD)

dispatch_queue_t downloadQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(downloadQueue, ^{

    ... Move all the loading part here.

    dispatch_async(dispatch_get_main_queue(),^{
        ... Do all the UI updates, mostly, [tableView reloadData];
    })
})
1 голос
/ 26 мая 2011

Возможно, вы могли бы добавить таймер для задержки вызова где-нибудь в вашем viewDidAppear методе. Например:

- (void)viewDidAppear:(BOOL)animated {
    [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(fetchData) userInfo:nil repeats:NO];
}

Это даст вашему приложению время для загрузки пользовательского интерфейса и запуска экрана загрузки, а затем начните получать данные позже. Вы также можете попробовать извлечь данные в фоновом потоке, если вы предпочитаете идти по этому пути

0 голосов
/ 02 ноября 2011

У меня была та же проблема с табличным представлением, которое изначально не загружалось, но оно сработало в другом .m-файле, который у меня был Вот тот, который работал:

добавьте это в свой viewDidLoad:

NSError *error = nil;
if (![[self fetchedResultsController] performFetch:&error]) {
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();
}

и это к блоку реализации:

#pragma mark -
#pragma mark Fetched results controller

- (NSFetchedResultsController *)fetchedResultsController {

    if (fetchedResultsController == nil) {
        // Create the fetch request for the entity.
        NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
        // Edit the entity name as appropriate.
        NSEntityDescription *entity = [NSEntityDescription entityForName:@"OMFrackinG" inManagedObjectContext:managedObjectContext];
        [fetchRequest setEntity:entity];

// группировка и сортировка необязательно

        //NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"country" ascending:YES];

        NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc] initWithKey:@"state" ascending:YES];// was name

        NSSortDescriptor *sortDescriptor2 = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];

        NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor1,sortDescriptor2, nil];

        [fetchRequest setSortDescriptors:sortDescriptors];
        propriate.

        NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:@"state" cacheName:nil];//@"state"
        aFetchedResultsController.delegate = self;
        self.fetchedResultsController = aFetchedResultsController;

        [aFetchedResultsController release];
        [fetchRequest release];
        [sortDescriptor1 release];
        [sortDescriptor2 release];
        [sortDescriptors release];
    }

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