cellForRowAtIndexPath вызван слишком поздно - PullRequest
0 голосов
/ 17 июня 2010

Я пытаюсь перезагружать таблицу каждый раз, когда некоторые данные, которые я получаю из Интернета, доступны.Вот что у меня есть:

SearchDataViewController:
<code>
- (void)parseDataXML {
    parsingDelegate = [[XMLParsingDelegate alloc] init];    
    parsingDelegate.searchDataController = self;
    // CONTAINS THE TABLE THAT NEEDS RE-LOADING;    
    ImplementedSearchViewController *searchController = [[ImplementedSearchViewController alloc] initWithNibName:@"ImplementedSearchView" bundle:nil];

    ProjectAppDelegate *delegate = [[UIApplication sharedApplication] delegate];
    UINavigationController *nav = (UINavigationController *)[delegate.splitViewController.viewControllers objectAtIndex: 0];
    NSArray *viewControllers = [[NSArray alloc] initWithObjects:nav, searchController, nil];
    self.splitViewController.viewControllers = viewControllers;
    [viewControllers release];
    // PASS A REFERENCE TO THE PARSING DELEGATE SO THAT IT CAN CALL reloadData on the table     
    parsingDelegate.searchViewController = searchController;

    [searchController release];

    // Build the url request used to fetch data
    ... 
    NSURLRequest *dataURLRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:dataURL]];
        parsingDelegate.feedConnection = [[[NSURLConnection alloc] initWithRequest:dataURLRequest delegate:parsingDelegate] autorelease];

}
</code>

ImplementedSearchViewController:
<code>
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    NSLog(@"count = %d", [keys count]);
    // keys IS A NSMutableArray
    return [self.keys count];    
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    ...
    cell.textLabel.text = [keys objectAtIndex:row];
    ...
}
</code>

XMLParsingDelgate:
<code>
-(void) updateSearchTable:(NSArray *)array {
    ...
    [self.currentParseBatch addObject:(NSString *)[array objectAtIndex:1]];
    // RELOAD TABLE
    [self.searchViewController.table reloadData];
}
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
  namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName
    attributes:(NSDictionary *)attributeDict {

    if ([elementName isEqualToString:@"..."]) {
        self.currentParseBatch = [NSMutableArray array];
        searchViewController.keys = self.currentParseBatch;
                ...
    }
        ...
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
  namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
    if ([elementName isEqualToString:@"..."]) {
                ...
        [self performSelectorOnMainThread:@selector(updateSearchTable:) withObject:array waitUntilDone:NO];
        }
        ...     
}
</code>

Моя проблема в том, что когда я отлаживаюсь, вызовы идут между reloadData и numberOfRowsInSection до тех пор, пока массив ключей не будет заполнен последними данными, во время которого вызывается cellForRowAtIndexPath:

reloadData -> numberOfRowsInSection
reloadData -> numberOfRowsInSection
...
reloadData -> numberOfRowsInSection -> cellForRowAtIndexPath

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

reloadData -> numberOfRowsInSection -> cellForRowAtIndexPath
reloadData -> numberOfRowsInSection -> cellForRowAtIndexPath
...
reloadData -> numberOfRowsInSection -> cellForRowAtIndexPath  

Есть идеи, почему такое поведение?

Спасибовы!

Ответы [ 3 ]

0 голосов
/ 17 июня 2010

Изменение с [self performSelectorOnMainThread:@selector(updateSearchTable:) withObject:array waitUntilDone:NO]; на [self performSelectorOnMainThread:@selector(updateSearchTable:) withObject:array waitUntilDone:YES]; решило мою проблему.

0 голосов
/ 15 февраля 2012

Проблема в том, что вы используете потоки, а не просто включаете или выключаете флаг. Выполните селектор в другом потоке, и он начнет работать. Вы также можете использовать executeSelectorOnBackground

0 голосов
/ 17 июня 2010

Вы спрашиваете, как загрузить части табличного представления вместо всего этого? Если это так, то для этой цели вы можете использовать relayodRowsAtINdexPath: или reloadSectionsAtIndexPath, вот ссылка TableView ref ...

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