调用API之后不等待响应

问题描述:

问题是我调用megnto 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被调用之前做印刷回应。如何解决这个problem.s

+0

因为它是在不同线程上运行的renewSession – 2013-05-03 12:59:56

+1

为什么这条线被注释掉了? – Undo 2013-05-03 13:00:00

1)所有进口后,加入这一行Magento.h

typedef void(^completion)(NSArray *list); 

2)改变方法签名,无论是在h和.M

- (void)startSession:(completion) completion 

3)Magento.m,修改方法与此

- (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)在viewController.h,声明一个全局变量保持返回的名称,

@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)使用self.nameList阵列加载该表

+0

我有一个问题,我怎样才能将参数传递给startSession方法 – UnderGround 2013-05-08 07:58:17

+1

哪种类型的参数是我的朋友?如果它是一个字符串,你可以使用这种方法, - (void)startSession:(完成)完成withString:(NSString *)inputString – 2013-05-08 08:12:03

+1

谢谢亲爱的!我虽然使用完成块后,我们无法传递任何其他参数,所以我很傻。感谢您快速重播。并感谢你我即将完成我的申请。 – UnderGround 2013-05-08 08:16:17

的Alloc所述的NSMutableArray第一和确保[Magento的.service renewSession]实际返回一个数组。

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

问题不是这样,但我调用不同的方法,而不是我已修改,但仍然给出的响应为零并且结果为 – UnderGround 2013-05-03 13:35:21

+0

在renewSession方法上放置一个断点,并确保它实际上是首先创建数组。你说你修改了这个方法来返回一个数组,所以这个问题的可能性更大。 – 2013-05-03 13:39:00

我不知道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); 
}]; 

这样只会把第一个对象列表中,并使其返回(只是以显示它实际返回的东西)。您需要定义一些逻辑来计算异步下载项目。