2010-06-17 5 views
0

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

 
SearchDataViewController: 

- (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]; 

} 
 

ImplementedSearchViewController: 

- (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]; 
    ... 
} 
 

XMLParsingDelgate: 

-(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]; 
     } 
     ...  
} 
 

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

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

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

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

Любые идеи, почему это поведение?

Спасибо!

ответ

0

Переход от [self performSelectorOnMainThread:@selector(updateSearchTable:) withObject:array waitUntilDone:NO]; к [self performSelectorOnMainThread:@selector(updateSearchTable:) withObject:array waitUntilDone:YES]; решить мою проблему.

0

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

+0

порядка № Моя проблема что reloadData вызывает только номерOfRowsInSection, а не cellForRowAtIndexPath. Когда массив kjeys заполняется, после того, как numberOfRowsInSection вызывается в последний раз, вызывается cellForRowAtIndexPath. –

+0

не уверен, что я следую, reloadData перезагружает весь вид таблицы, поэтому сначала будет вызван номерOfRows, а затем он вызовет cellForRowatIndexPath для всех строк ... – Daniel

+0

В этом проблема, cellForRowatIndexPath не вызывается после вызова numberOfRowsInSection, она получает только вызванный после того, как мой массив ключей был заполнен последним элементом. Я обновил последнюю часть своего оригинального сообщения, чтобы лучше объяснить ситуацию. –

0

Проблема с вашим использованием потоков НЕ с «просто» поворачивая флаг ON или Off.Perform селектор в другом потоке и начать бы также может Осуществляется использовать performSelectorOnBackground

Смежные вопросы