2015-01-13 2 views
0

서버 (있는 경우)에서 새 데이터를 가져 오려면 UITableView 및 새로 고침 버튼이 있습니다. getDataFromServer 서버가 새로운 데이터 (응답)을 반환 할 때 완료 비동기 방식이기 때문에iOS 용 비동기 작업 완료

[self startUpdates]; // animations 
[[User myUser] getDataFromServer]; //async 
[[User myUser] refreshElements:[[[UpdateContext alloc] initWithContext:data_ with:self with:@selector(endUpdates)] autorelease]]; 
[self.tableView reloadData]; 

위의 코드는 잘 작동하지 않습니다. 나는 refreshElements인 경우에만 getDataFromServer이 응답을 반환 할 때만 실행되고 있는지 100 % 확신하고 싶습니다.

질문 : 올바른 방법은 무엇입니까? 라인 2가 서버로부터 응답을 얻는 경우에만 3 번 라인이 실행되도록하고 싶습니다. 어떤 아이디어?

+1

당신이 전송되는 콜백을 사용해야합니다을 때 서버 데이터 전송이 완료되었습니다 ...하지만 당신이 제공 한 희소 정보로 말하기 어렵습니다. 사용자 란 클래스 란 무엇입니까? 어쩌면 이미 필요한 것을 구현하는 방법일지도 모릅니다. – Volker

답변

3

가장 쉬운 방법은 서버에서 데이터를 가져온 후 실행해야하는 코드가 포함될 블록을 허용하도록 getDataFromServer 메소드를 변경하는 것입니다. 블록이 주 스레드에서 실행되는지 확인해야합니다. 여기 은 예입니다

변경된 방법 :

- (void)getDataFromServer:(void (^)(NSError * connectionError, NSDictionary *returnData))completionHandler{ 

    //perform server request 
    //... 
    // 
    NSDictionary * data; //the data from the server 
    NSError * connectionError; //possible error 
    completionHandler(connectionError, data); 
} 

그리고 블록에 새로운 메서드를 호출하는 방법 :

[self getDataFromServer:^(NSError *connectionError, NSDictionary *returnData) { 
    if (connectionError) { 
     //there was an Error 
    }else{ 
     //execute on main thread 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [[User myUser] refreshElements:[[[UpdateContext alloc] initWithContext:data_ with:self with:@selector(endUpdates)] autorelease]]; 
      [self.tableView reloadData]; 
     }); 
    } 
}]; 
관련 문제