2013-05-03 6 views
2

문제는 내가 메고 API를 호출하지만, API가 모든 다른 명령문이 실행되기 전에 객체를 리턴 할 때입니다.호출 후 API가 응답을 기다리지 않습니다.

NSMutableArray *list=[Magento.service startSession]; 

    NSLog(@"Record is:%@",list); 
내가 수정 한

startSession 방법은 다음과 같습니다

- (NSMutableArray *)startSession 
{ 
NSString *_sessionID; 
    NSNumber *nsPage =[NSNumber numberWithInt:1]; 
    NSNumber *nsData =[NSNumber numberWithInt:10]; 
    NSMutableArray *listOfName = [[NSMutableArray alloc] init]; 
    NSArray *args = [NSArray arrayWithObjects:nsPage,nsData,nil ]; 
    @synchronized(self) { 
    _sessionID = sessionID; 
} 
if (_sessionID != FAILED_SESSION) 
    dispatch_group_enter(session_group); 
[client postPath:@"login" parameters:@{@"username": MAGENTO_USERNAME, @"apiKey": MAGENTO_API_KEY} success:^(AFHTTPRequestOperation *operation, id responseObject) { 
    sessionID = responseObject; 



    dispatch_group_leave(session_group); 

     [client postPath:@"call" parameters:@{@"sessionId":sessionID, @"resourcePath":@"callforprice_collection.getCallForPriceCollection", 
     @"args":args 
     } success:^(AFHTTPRequestOperation *operationData, id responseData) { 

      NSLog(@"Response : %@",responseData); 
      [listOfName addObject:[responseData valueForKey:@"name"]]; 

     } failure:^(AFHTTPRequestOperation *operationData, NSError *error) { 
      NSLog(@"Response is not get"); 
      sessionID = FAILED_SESSION; 
     }]; 


     NSLog(@"got session %@", sessionID); 
} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    sessionID = FAILED_SESSION; 
}]; 
    return listOfName; 

} 

O/P는

2013-05-03 06:27:16.272 CallForPrice[3120:c07] Record is:() 
2013-05-03 06:27:19.836 CallForPrice[3120:c07] got session 88ef34087a12809334ae3a0c839f85b6 
** response that i have printed in method** 
2013-05-03 06:27:22.048 CallForPrice[3120:c07] Response : (
     { 
     "callforprice_id" = 13; 
     country = Austria; 
     "created_time" = "2013-05-03 12:03:05"; 
     emailid = "[email protected]"; 
     message = hfhftrfygjh; 
     name = "Richard Conover"; 
     "phone_no" = 8977896; 
     "product_name" = Ottoman; 
     "product_options" = ""; 
     "update_time" = "0000-00-00 00:00:00"; 
    }, 
     { 
     "callforprice_id" = 12; 
     country = "Antigua and Barbuda"; 
     "created_time" = "2013-05-03 12:01:24"; 
     emailid = "[email protected]"; 
     message = sdfsdfsdfwe; 
     name = "Richard Conover"; 
     "phone_no" = 5645; 
     "product_name" = Ottoman; 
     "product_options" = ""; 
     "update_time" = "0000-00-00 00:00:00"; 
    }, 
     { 
     "callforprice_id" = 11; 
     country = Angola; 
     "created_time" = "2013-05-03 11:58:51"; 
     emailid = "[email protected]"; 
     message = 6tyrtyryrty; 
     name = "Kaitlyn Matheson"; 
     "phone_no" = 564564; 
     "product_name" = Ottoman; 
     "product_options" = ""; 
     "update_time" = "0000-00-00 00:00:00"; 
    }, 

startSession이 NSLOG 통화하기 전에 인쇄되는 일이 무엇인지 실제로 기록을 표시입니다 응답. 이

+0

renewSession이 다른 스레드에서 실행되기 때문에 –

+1

왜 한 줄이 주석 처리 되었습니까? – Undo

답변

2

1) 모두 .H와하는 .m

- (void)startSession:(completion) completion 
에)
typedef void(^completion)(NSArray *list); 

2 Magento.h

의 모든 수입 후이 줄을 추가하는 방법 서명을 변경 problem.s 해결하는 방법

3) Magento.m에, 당신의 viewController.h에서)이

- (void)startSession:(completion) completion 
{ 

     NSString *_sessionID; 
     NSNumber *nsPage =[NSNumber numberWithInt:1]; 
     NSNumber *nsData =[NSNumber numberWithInt:10]; 
     NSMutableArray *listOfName = [[NSMutableArray alloc] init]; 
     NSArray *args = [NSArray arrayWithObjects:nsPage,nsData,nil ]; 
     @synchronized(self) { 
      _sessionID = sessionID; 
     } 
     if (_sessionID != FAILED_SESSION) 
      dispatch_group_enter(session_group); 
     [client postPath:@"login" parameters:@{@"username": MAGENTO_USERNAME, @"apiKey": MAGENTO_API_KEY} success:^(AFHTTPRequestOperation *operation, id responseObject) { 
      sessionID = responseObject; 



      dispatch_group_leave(session_group); 

      [client postPath:@"call" parameters:@{@"sessionId":sessionID, @"resourcePath":@"callforprice_collection.getCallForPriceCollection", 
      @"args":args 
      } success:^(AFHTTPRequestOperation *operationData, id responseData) { 

       NSLog(@"Response : %@",responseData); 
       [listOfName addObject:[responseData valueForKey:@"name"]]; 

       completion(listOfName); 

      } failure:^(AFHTTPRequestOperation *operationData, NSError *error) { 
       NSLog(@"Response is not get"); 
       sessionID = FAILED_SESSION; 
       completion(nil); 
      }]; 


      NSLog(@"got session %@", sessionID); 
     } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
      sessionID = FAILED_SESSION; 
      completion(nil); 
     }]; 

} 

4와 방법을 수정 전역 변수로 선언

@property(nonatomic, strong) NSArray *nameList; 

// and in viewDidLoad method, 
self.nameList = [[NSArray alloc] init]; 

5)의 viewDidLoad이 코드 단편을 넣거나

[Magento.service startSession:^(NSArray *list) { 
    if(list){ 
     self.nameList = list; 
     [self.tableView reloadData]; 
    }else self.nameList = [[NSArray alloc] init]; 
}]; 

6) 표

+0

나는 하나의 질문을 어떻게 beginSession 메서드에 매개 변수를 전달할 수 – UnderGround

+1

매개 변수의 유형 내 친구? 문자열이라면이 종류의 메서드를 사용할 수 있습니다. - (void) startSession : (완료) withString : (NSString *) inputString –

+1

감사합니다. 난 완료 블록을 사용한 후에는 다른 매개 변수를 전달할 수 없으므로 어리 석다. 빨리 재생 해 주셔서 감사합니다.제 신청서를 완성 할 수있게되어서 고맙습니다. – UnderGround

1

ALLOC있는 NSMutableArray를로드 self.nameList 어레이를 사용하여 제 있는지 [젠토을 반환 이름을 길게 .service renewSession] 실제로 배열을 반환합니다.

NSMutableArray *list = [NSMutableArray array]; 
list=[Magento.service renewSession]; 
//[Magento.service getCallForPriceData]; 
NSLog(@"Record is:%@",list); 
+0

문제는 아니지만 다른 메서드를 호출하기보다는 수정 한 것입니다. 응답 없음 및 결과보다 – UnderGround

+0

renewSession 메서드에 중단 점을 배치하고 실제로 배열을 먼저 만들고 있는지 확인하십시오. 문제가 발생할 가능성이있는 곳에서 배열을 반환하는 메서드를 수정했다고 말합니다. –

0

나는 Magneto API를 알지 못했지만이 동작은 전에 만났다. 이것은 비동기적인 방법입니다. startSession에서 비어있는 목록으로 돌아가서 다른 스레드에서 비동기 호출을 수행합니다. 그리고 응답에서 당신은 결과로 아무 것도하지 않습니다. 블록은 로컬 참조를 저장합니다. 즉, 로컬 참조를 추가 할 수 있습니다. 에

startSessionWithCompletionBlock:(void(^)(NSArray* list))completionBlock; 

기능과 변화 응답 핸들러를 정의하려고 :

NSLog(@"Response : %@",responseData); 
[listOfName addObject:[responseData valueForKey:@"name"]]; 
completionBlock(listOfName); 

[Magento.service startSessionWithCompletionBlock:^(NSArray* list){ 
    NSLog(@"Record is:%@",list); 
}]; 

전화에만이 목록의 첫 번째 개체를 넣어 것입니다 그냥 (그것으로 반환 실제로 무엇인가 가지고 돌아 오는 것을 보여주기 위해). 다운로드 한 비동기 항목도 계산하려면 논리를 정의해야합니다.

관련 문제