2011-12-21 4 views
5

내 웹 서비스에서 데이터를 가져 오기 전에 테이블이로드되는 상황이 있습니다.connectionDidFinishLoading에서 데이터를 가져 오기 전에 UITableView가 표시됩니다.

디버그 할 때 내 NSMutableArray에는 123 개의 개체가 있지만 테이블에 반영되지 않은 것을 볼 수 있습니다.

이 내 connectionDidFinishLoading 방법 :이 내가 갖는 내 jsonObjects 및 내 컬렉션을 채우기를 디버깅 할 경우

-(void)connectionDidFinishLoading:(NSURLConnection *)conn{ 
myData = [[NSString alloc] initWithData:xData encoding:NSUTF8StringEncoding]; 
SBJsonParser *jParser = [SBJsonParser new]; 
NSError *error = nil; 
NSArray *jsonObjects = [jParser objectWithString:myData error:&error]; 
NSMutableArray *books = [[NSMutableArray alloc] init]; 

for(NSDictionary *dict in jsonObjects) 
{ 
    Book *b = [Book new]; 
    b.bookName =[dict objectForKey:@"name"]; 
    b.published = [dict objectForKey:@"published"]; 
    [books addObject:b]; 

} 
self.bookArray = books; 
[self.tableView reloadData]; 
NSLog(@"myData = %@",myData); 
} 

. 그러나 나는 나의 테이블이 아직도 비어있는 것을 알아 차린다.

(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 
... 
Book *b = (Book *)[self.bookArray objectAtIndex:[indexPath row]]; 
cell.textLabel.text = b.bookName; 
.... 

사람이 내가 부족 무엇을 도와 수 :

그냥이 내 tableView 방법입니다 명확하게?

+0

전체 cellForRow 메서드를 보자. rowsForSection을 구현 했습니까? – Dancreek

+0

@Dancreek 나는 numberOfRowsForSection을 의미한다고 생각하십니까? 어쨌든, 그 그리고 [tableview reloadData] 내가 그 주제를 읽을 때 나는 나의 의혹이었다. 그는 reloadData를 호출하고 있는데, 이는 후자를 제거합니다. – barley

+0

- (NSInteger) tableView : (UITableView *) tableView numberOfRowsInSection : (NSInteger) 섹션 { return bookArray.count; } – Matt

답변

1

호출 스레드를 확인하십시오. mainThread 이외에는 UIKit 업데이트를 할 수 없습니다. 귀하의 connectionDidFinishLoading : 별도의 스레드에서 호출하고 여기에 문제가 있다고 생각합니다.

dispatch_async(dispatch_get_main_queue(), ^{ 
    [self.tableView reloadData]; 
}); 
1

당신은 데이터가 표시되지 및 표시 할 데이터가있는 경우에 거기있는 경우에 numberOfRowsInSection (및 numberOfSections)에 의해 반환되는 것을 고려할 필요가보십시오. reloadData를 호출 할 때마다 tableView는이 두 메서드를 호출하여 데이터 소스에 대한 최신 정보를 가져옵니다. 데이터가로드되지 않은 경우 이러한 위임 메서드는 적절한 값을보고해야합니다. 데이터가로드되지 않은 경우 nil 값을 테스트하거나 유사한 테스트를 수행 한 다음 적절한 값을 반환 할 수 있습니다. 데이터가로드되면 대리자 메서드는 데이터 소스의 내용 크기를 기반으로 값을 반환해야합니다.

이러한 방법에 대한 코드를 표시하면 다른 사람이 자신의 문제인지 아닌지에 대해 의견을 말할 수 있습니다.

+0

두 번째 질문에서, 내용이 비어 있다는 것을 안다면 tableView의'hidden' 속성을 설정할 수 있습니다. 당신은 내가 언급 한 deleegate 메소드 중 하나에서 이것을 할 수있다. 보여줄 내용이있을 때 그것을 숨기기 (숨김 = 아니오)하는 것을 잊지 마십시오. – Jim

+0

- (NSInteger) numberOfSectionsInTableView : (UITableView *) tableView { // 섹션 수를 반환합니다. return 1; } - (NSInteger) tableView : (UITableView *) tableView numberOfRowsInSection : (NSInteger) 섹션 { return bookArray.count; } 나는이 방법을 많이 사용하지 않는다. – Matt

+0

방금 ​​내 프로그램을 디버깅하고, 배열에 데이터가 채워지기 전에 numberOfRowsInSection을 한 번 호출합니다. 다시 호출되지 않습니다. – Matt

1

웹 사이트를 통해을 다운로드 할 때까지 할 방법이 없기 때문에 테이블을로드하지 않습니다.

IB를 통해 대리인을 설정하지 마십시오. 이 웹 요청을 완료 한 후 코드를 통해 델리게이트와 데이터 소스를 설정 한 다음 reloadData 메서드를 호출하십시오. 우리는 웹 콜이 처리 될 때까지 테이블 대기를 기다릴 수 있습니다. 데이터가로드되는 동안 커스텀 HUD의 깔끔한 활동 표시기를 제공하십시오. 그 일을해라

+1

downvoting 동안 의견을 추가하십시오 –

+0

대표자를 설정하는 것은 좋습니다. 데이터 소스 방법에서, 그는 다운로드가 완료되면 고려해야합니다. –

+0

"다운로드가 완료되면 계정을 고려해야합니다." 방법? –

관련 문제