2010-06-17 6 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]; 
     } 
     ...  
} 
 

내 문제는 내가 디버깅 할 때 키 배열이 마지막 데이터의 cellForRowAtIndexPath가 호출되는있는 시간이 가득 될 때까지 호출 reloadData 및 numberOfRowsInSection 사이를 이동한다는 것입니다 : 이것은 내가 무엇을 가지고 테이블 내가 보내 각 요소 하나 하나에 대한 업데이트하기

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

내가 원하는입니다 :

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

어떤 아이디어 왜 이런 행동을?

감사합니다.

답변

0

입니다.

0

전체보기의 테이블보기 inst 부분을로드하는 방법을 묻는 중입니까? 그럼 유 relaodRowsAtINdexPath 사용할 수있는 경우이 목적을 위해 또는 reloadSectionsAtIndexPath을 여기 [self performSelectorOnMainThread:@selector(updateSearchTable:) withObject:array waitUntilDone:YES]; 내 문제를 해결 [self performSelectorOnMainThread:@selector(updateSearchTable:) withObject:array waitUntilDone:NO];에서에 변경 참조 TableView ref ...

+0

호에게 내 문제를 사용할 수 있습니다 work.You에 시작될 것입니다 reloadData는 cellForRowAtIndexPath가 아니라 numberOfRowsInSection 만 호출한다는 것입니다. kjeys 배열이 채워지면 numberOfRowsInSection이 마지막으로 호출 된 후 cellForRowAtIndexPath가 호출됩니다. –

+0

잘 모르겠습니다. reloadData가 전체 tableview를 다시로드하므로 numberOfRows가 먼저 호출 된 다음 모든 행에 대해 cellForRowatIndexPath가 호출됩니다. – Daniel

+0

numberOfRowsInSection이 호출 된 후 cellForRowatIndexPath가 호출되지 않으면 문제가 발생합니다. 내 키 배열이 마지막 요소로 채워진 후에 호출됩니다. 상황을 더 잘 설명하기 위해 원래 게시물의 마지막 부분을 업데이트했습니다. –

0

문제는 NOT "그냥"다른 스레드에서 선택기를 ON 플래그를 켜거나 Off.Perform와 스레드의 사용으로하고 또한 performSelectorOnBackground가

관련 문제