Когда загружать данные в UITableViewController? - PullRequest
8 голосов
/ 27 июля 2011

В настоящее время я загружаю данные, поступающие из службы JSON в методе viewDidLoad в UITableViewController. Проблема в том, что для извлечения и анализа данных требуется время, а для создания представления требуется время. Где лучше всего загрузить эти данные? Я предполагаю, что где-то есть ловушка для загрузки данных после создания представления. Сделав это, я смогу использовать UIActivityIndicatorView в окончательном виде. Спасибо

Ответы [ 3 ]

6 голосов
/ 27 июля 2011

Наконец, вот решение, основанное на комментариях: Запустите поток в viewDidLoad, чтобы получить данные, не блокируя все:

- (void) viewDidLoad
{
    dataLoaded = NO;

    [self initSpinner];
    [self launchLoadData];
...
}

-(void)launchLoadData {
    NSLog(@"Launching thread");
    [NSThread detachNewThreadSelector:@selector(loadData) toTarget:self withObject:nil];
}

- (void) loadData {
    dataLoaded = NO;
    NSLog(@" thread launched");
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    [self loadDataFromURL:nil];
    dataLoaded = YES;
    [self.tableView reloadData];
    [pool release];
}

- (void)loadDataFromURL:(NSString*)url {
    // start the spinner to show that loading may be time consuming...
    [NSThread detachNewThreadSelector: @selector(spinBegin) toTarget:self withObject:nil];
    JSONLoader *loader = [[JSONLoader alloc] init];
    self.accounts = [loader getAccountsFromURL:@"http://foo/bar/repository.json"];
    [loader release];
    //[NSThread sleepForTimeInterval:3];
    [NSThread detachNewThreadSelector: @selector(spinEnd) toTarget:self withObject:nil];
}

и используйте флаг для отображения или отсутствия данных в таблице.tableView reloadData сделает все остальное при вызове из потока.

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if (dataLoaded) return [self.accounts count];
    return 0;
}
1 голос
/ 27 июля 2011

Я думаю, что вы пытаетесь задать рабочий процесс для отображения данных из веб-службы в UITableView.

Вот что я рекомендую:

  • ВашviewDidLoad делает NSURLRequest для вашего файла JSON.Также добавляет представление загрузки к текущему представлению (я использую UIView с черным bg (0,5 альфа), плюс метку и UIActivityIndicator).В этом методе вы также устанавливаете BOOL ivar (который вам нужно добавить в заголовок) с именем loaded в NO.

  • Вы объединяете данные NSURLRequest по мере их поступления визменяемый объект данных.

  • Когда ваш NSURLRequest заканчивается, вы превращаете его данные в строку и анализируете JSON в некоторый массив (или словарь, если хотите).Таким же способом вы удаляете представление загрузки и меняете логическое значение loaded на YES.Затем вы указываете tableView перезагружать данные: [self.tableView reloadData];

Вот где происходит волшебство ... в ваших методах табличного представления

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if (loaded) return [myArrayOfJSONObjects count];
    return 0; // Will only return 0 if the data is not downloaded
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSUInteger row = [indexPath row];

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    // Configure the cell...
    if (loaded) {
        cell.textLabel.text = [myArrayOfParsedJSONObjects objectAtIndex:row];
        //Anything else you want to set
    }
    else {
        //Do nothing :) - you shouldn't reach this else anyway because your numberOfRows method should stop it
    }
}
0 голосов
/ 27 июля 2011

Вы можете открыть новый вид и показать UIActivityIndicator с сообщением для пользователя, что вы загружаете свежие данные для него.

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

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