2011-02-27 5 views
1

디자인에 대한 의견을 듣고 싶습니다. 내 애플 리케이션은 일부 JSON 데이터를 얻기 위해 비동기 요청을 보내고 잘되면 내가 내 콜백 메소드를 얻은 다음 다른 콜백에서 일부 데이터에 대한 다른 비동기 요청을 시작하고 계속해서 내 코드가 있다고 느낀다. 스파게티 코드처럼되기 위해서, 나는 하나의 콜백 메소드에서 다른 콜백에 대한 요청으로 건너 뛰고 더 나은 디자인에 대한 아이디어를 요청할 것입니다.비동기식 요청 디자인 개선

(실제 코드가 아닙니다하지만 내 포인트를 표시) 나에게 몇 가지 예제 코드를 보여 드리죠 :

-(void)startApp { //make an request and use callBackMethod to parse data }

-(void)callBackMethod { //parse data and check it, if ok go make next request and use CallBackMethod1 }

-(void)callBackMethod1 { //parse data and check it, if ok go make next request and use CallBackMethod2 }

-(void)callBackMethod2 { //parse data and check it, if ok go make next request and use CallBackMethod3 }

-(void)callBackMethod3 { //parse data }

당신은 요점을 얻습니다. 그것은 내 생각에 뒤죽박죽이고 나는 더 읽기 쉽고 유지하기 쉬운 것으로 코드를 리팩터링하려고합니다. 블록에 대해 들었어. 어떻게하면 내 디자인을 더 좋게 만들 수 있는지 알 수 없습니다.

donnib

답변

0

더 설명 메소드 이름을 사용해야하지만, 당신의 비동기 요청 디자인, 괜찮습니다. 여기의 예제는 실제로 스파게티 코드가 아니며 다소 복잡한 것을하고 코드 구조가 반드시 반영해야합니다.

구현하여 블록은 다음과 같이 막연하게 보일 것입니다 :

- (void)startApp { 
    [self makeRequest:... completionHandler:^(NSData *data){ 
     // Parse data and check it, as in callBackMethod 
     if (ok) [self makeRequest:... completionHandler:^(NSData *data){ 
      // Parse data and check it, as in callBackMethod1 
      if (ok) [self makeRequest:... completionHandler:^(NSData *data){ 
       // Parse data and check it, as in callBackMethod2 
       if (ok) [self makeRequest:... completionHandler:^(NSData *data){ 
        // Parse data, as in callBackMethod3 
       }]; 
      }]; 
     }]; 
    }]; 
} 

또는 쉽게 따라하지 않을 수 있습니다 상황에 따라. 또 다른 대안은, 당신이 쿼리하고있는 웹 서비스를 제어하고 "check"가 적절하다면, 웹 서비스가 모든 체크를 끝내고 모든 데이터를 하나의 응답으로 리턴하는 것입니다. -앞으로.