2012-04-10 6 views
0

Xcode 프로젝트에서는 ParentViewController 클래스와 하위 클래스 인 다른 클래스 ChildViewController 클래스가 있습니다. ParentViewController 클래스에서 우리는 NSURLConnection, didReceiveDataconnectionDidFinishLoading을 사용하여 백 엔드 서버에서 일부 데이터를 가져옵니다. 완벽하게 잘 작동합니다. 이제 내 ChildViewController에서 연결을 만들고 백엔드에서 데이터를 가져와야합니다. 하지만 didReceiveDataconnectionDidFinishLoadingChildViewController에 추가하면 didReceiveDataParentViewController에 더 이상 보이지 않습니다. 나는 왜 궁금해하니?didReceiveData 서브 클래스에서 덮어 쓰기

백도어를 보내 달라는 요청이 많아서 didReceiveDataconnectionDidFinishLoading(connect == someConnection) 문으로 압도적으로 많습니다. 이 상황을 처리 할 수있는 깔끔한 방법이 궁금합니다. 감사.

답변

0

하위 클래스는 ParentViewController의 연결 대리자 메서드를 상속합니다. 하위 클래스에서 동일한 동작을 원한다면 대리자 메서드를 구현하지 마십시오.

또 다른 아이디어는 위임 메서드를 모두 피하는 것입니다. iOS5를에서있는 NSURLConnection이 완료 블록을 사용하여 연결을 시작하는 더 나은 방법을 제공하므로 다음과 같이 각 연결에 대한 코드는 맥락에서 찾을 수 있습니다 :

NSURLRequest *requestA = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http..."]]; 
[NSURLConnection sendAsynchronousRequest:requestA queue:[NSOperationQueue currentQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { 
    // do what you need to do when requestA completes 
}]; 

NSURLRequest *requestB = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http..."]]; 
[NSURLConnection sendAsynchronousRequest:requestA queue:[NSOperationQueue currentQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { 
    // do what you need to do when requestB completes 
}]; 

나는 다른 답변에 동의 당신이 수도 앱이 많은 원격 요청을하는 경우 디자인을 다시 생각하고 싶습니다.

0

데이터를 가져와야하는 곳이 아닌보기 컨트롤러에서 데이터를 가져 오는 중 문제가 발생했습니다.

모든 데이터 가져 오기를 모델 개체로 이동하십시오. 뷰 컨트롤러가 무언가를 필요로 할 때 모델이로드하도록 요청할 수 있습니다. 그런 다음보기 컨트롤러가 화면을 벗어나더라도 모델은 올바르게 업데이트되고보기 컨트롤러가 완료되면이를 알릴 수 있습니다.

일반적으로 각 연결에 대해 단일 모델 개체를 사용할 수 있습니다. 예를 들어 서버 데이터베이스에서 개인 레코드를 업데이트하는 경우 Person 개체는 자체 데이터를 요청합니다. 그런 다음 connectionDidFinishLoading은 해당 연결을 처리해야합니다.

중앙 대기열 (예 : NSOperationQueue)을 통해 연결을 설정하여 요청과의 네트워크 연결이 너무 복잡하지 않도록 할 수 있습니다. 그러나 각 연결에 대한 델리게이트는 뷰 컨트롤러가 아닌 관련 모델 객체입니다.