2015-01-14 1 views
0

를 실행하지 내 코드는 다음과 같습니다있는 NSURLConnection sendAsynchronous 여러 요청이 나는 웹 서비스</p> <p>을에 (루프의에서) URL의 10 개 요청을 전송 별도로 반환 여기</p> <p>으로 10 개 JSON 형식의 데이터를 얻을 것으로 예상했다

NSArray *reqArray = [10 requests of url inside]; 
NSMutableArray * saveArray = [prepare to store 10 JSON data in here]; 
NSInteger counter = [reqArray count]; 

for (NSURLRequest *request in reqArray) { 
    [NSURLConnection sendAsynchronousRequest:request 
             queue:[NSOperationQueue mainQueue] 
          completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { 
           NSDictionary *result1 = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil]; 
           NSDictionary *result2 = [result1 objectForKey:@"keyForValueIWant"]; 
           [saveArray addObject:result2]; 
          counter -- ; 
           if (counter == 0) { 
            NSLog(@"all done"); 

           } 
          }]; 

} 

completionHandler는 실행되지 않으며 항상 반환 값이 없습니다.

내가 NSURLConnetion을 잘못 이해했거나 잘못 했나요?

어떤 조언을 주시면 감사하겠습니다.

편집

나는 코드가 (내가 그것을 어디다)

을 완료 심지어 내가 dispatch_async (dispatch_get_main_queue()에 포장하려고있는 viewDidLoad에서 다른 모든 코드 다음에 실행됩니다 발견,^{},

즉시 내가 전화 할 때마다 작동 할 수 있는지? sendSynchronous 요청을

?

+0

그렇다면 completionHandler 내부의 코드는 nerver 실행 중입니까? 아니면 지연으로 실행 중입니까? 이는 비동기 요청이기 때문에 서버에서 응답을 받으면 작동하는 방식입니다. , completionHandler 블록이 실행됩니다. – gabuh

+0

@gabuh 내부 코드가 실행됩니다 ...하지만 다른 코드를 실행하기 전에 완료해야합니다. 지금 동기 요청을 보내려고 ... 끔찍하게 내 프로그램을 붙어 :/ – bluenowhere

+0

주 스레드에서 동기 요청을 보내는 것은 좋은 생각이 아닙니다. 비동기 요청을 처리하도록 코드를 구조화하는 방법을 생각해야합니다. 배열을로드하고 있으며 프로그램을 작동 시키려면 해당 배열이 필요합니다. 무엇을 사용하고 계십니까?, tableView로드? 당신은 그 배열의 내용에 의존하여 무엇이든 다시로드하기 위해 완성 블록에서 무엇인가를 트리거 할 수 있습니다. – gabuh

답변

0

난 당신이 추측 메인 루프 오프 이러한 연결을 시작으로 시도 :

NSArray *reqArray = [10 requests of url inside]; 
NSMutableArray * saveArray = [prepare to store 10 JSON data in here]; 
NSInteger counter = [reqArray count]; 

for (NSURLRequest *request in reqArray) { 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [NSURLConnection sendAsynchronousRequest:request 
            queue:[NSOperationQueue mainQueue] 
         completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)  { 
          NSDictionary *result1 = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil]; 
          NSDictionary *result2 = [result1 objectForKey:@"keyForValueIWant"]; 
          [saveArray addObject:result2]; 
         counter -- ; 
          if (counter == 0) { 
           NSLog(@"all done"); 

          } 
         }]; 
    }); 
} 

을 runloop가 끝나면있는 NSURLConnection은 실행하기 runloop을 필요로하기 때문에, 연결이 종료됩니다.

+0

! 여전히 건너 뛰었습니다 ... – bluenowhere