2014-04-29 1 views
0

테이블 뷰의 배열 속성에 일부 데이터를 저장하는 API 호출이 있습니다.cellForRowAtIndexPath 다음에 ViewDidLoad 성공 블록이 호출되었습니다.

나는 viewDidLoad으로 전화를 걸며, 성공하기 전에 API 호출을 실행하는 것을 제외하고는 모두 잘 돌아 간다.

다음 cellForRowAtIndexPath으로 이동하여 NSDictionary에 대한 호출에서 얻은 데이터를 설정하고 해당 행 다음에 cellForRowAtIndexPath 메서드를 완료하지 않습니다. 그것은 다시 점프와 cellForRowAtIndexPath

이 직접 성공 블록 전에 하나의 viewDidLoad에서이다 얻을 라인에 다시 재개하기 전에 API 호출의 성공 코드를 실행합니다 :

[manager GET:urlString parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject)

그 다음 cellForRowAtIndexPath이 라인에 점프 :

0

의 viewDidLoad 방법 :

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.tableView.tableFooterView = [[UIView alloc] init]; 

    GFCredentialStore *credentialStore = [[GFCredentialStore alloc] init]; 

    NSString *authToken = [credentialStore authToken]; 
    NSLog(@"%@", authToken); 

    __weak typeof(self)weakSelf = self; 

    NSString *userID = self.userID; 

    NSString *urlString = [NSString stringWithFormat:@"%s%s%@%@", kBaseURL, kUserURL, userID, @".json"]; 

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
    manager.responseSerializer = [GFUserResponseSerializer serializer]; 
    [manager.requestSerializer setValue:authToken forHTTPHeaderField:@"auth_token"]; 
    NSLog(@"%@", manager.requestSerializer.HTTPRequestHeaders); 
    [manager GET:urlString parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { 
     __strong typeof(weakSelf)strongSelf = weakSelf; 
     strongSelf.user = (NSArray *)responseObject; 
     [strongSelf.tableView reloadData]; 
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     NSLog(@"Error: %@", error); 
    }]; 
} 

cellForRowAtIndexPath 방법 : 어떤 도움

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    if(indexPath.section == 0){ 

     GFProfileCell *cell = [tableView dequeueReusableCellWithIdentifier:@"profileCell" forIndexPath:indexPath]; 

     NSDictionary *user = self.user[0]; 

     cell.usernameLabel.text = user[@"username"]; 

     cell.bioLabel.text = user[@"description"]; 

     NSString * avatarURL = [NSString stringWithFormat:@"%s%s%@%s%@%s", kBaseURL, "system/users/avatars/", user[@"id"], "/original/", user[@"username"], ".png"]; 

     NSString * newAvatarURL = [avatarURL stringByReplacingOccurrencesOfString:@" " withString:@"_"]; 

     [cell.avatarImage setImageWithURL:[NSURL URLWithString:newAvatarURL] placeholderImage:[UIImage imageNamed:@"Zoo.png"]]; 

     cell.avatarImage.layer.cornerRadius = 40; 
     cell.avatarImage.layer.masksToBounds = YES; 

     [cell.followingCountBtn addTarget:self action:@selector(followingBtnClick:) forControlEvents:(UIControlEvents)UIControlEventTouchDown]; 
     [cell.followerCountBtn addTarget:self action:@selector(followerBtnClick:) forControlEvents:(UIControlEvents)UIControlEventTouchDown]; 

     // edit profile becomes follow 
     cell.editProfileButton.layer.cornerRadius = 3; 
     cell.editProfileButton.layer.borderColor = UIColorFromRGB(0x1FAA4E).CGColor; 
     cell.editProfileButton.layer.borderWidth = 1.0f; 
     cell.editProfileButton.titleLabel.textColor = UIColorFromRGB(0x1FAA4E); 

     return cell; 

    } 
    else if(indexPath.section == 1){ 

     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; 

     return cell; 

    } 
    else { 

     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"postsCell" forIndexPath:indexPath]; 

     return cell; 

    } 
} 

감사

여기 내 전체 코드입니다.

+0

죄송합니다. 무슨 문제입니까? 그것은 부서 지는가? –

답변

3

사용중인 API (AFNetworking)는 비동기식이므로 성공 차단은 자연스럽게 네트워크에서 데이터를받은 후에 만 ​​실행됩니다.

한편, tableview는 이미 데이터를로드하기 시작할 것입니다.

이 기간 동안 진행 표시기 (또는 애니메이션로드)를 표시하거나 가능한 경우 미리 데이터를로드 할 수 있습니다 (로그인 한 사용자의 데이터가로드되어있는 것처럼 보입니다). 어쨌든 앱이 시작될 때 이것을로드하는 것이 좋습니다).

+0

+1. 그리고 명확히하기 위해, 이것은 AFNetworking-only 문제는 아닙니다. 이것은 데이터가 빨리 나타나거나 천천히 나타나거나 전혀 나타나지 않기 때문에 배울 필요가있는 패턴입니다. (보기 컨트롤러 또는 테이블 대리자 메서드는 데이터가있는 상태를 알 수 있고 사용자에게 적절하게 표시 할 수 있어야합니다. 지금 데이터가 이미 있다고 가정하고 있습니다.) –

+0

매우 사실입니다. 거기에 동기 네트워킹 API (예 :'NSURLConnection's'sendSynchronousRequest : ...'메서드)가 있지만 일반적으로 메인 스레드에서 작업하는 동안 동기식 네트워크 호출을 사용하는 것은 좋지 않습니다. –

+1

대개 = 항상 :) –

관련 문제