调用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
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
阵列加载该表
我有一个问题,我怎样才能将参数传递给startSession方法 – UnderGround 2013-05-08 07:58:17
哪种类型的参数是我的朋友?如果它是一个字符串,你可以使用这种方法, - (void)startSession:(完成)完成withString:(NSString *)inputString – 2013-05-08 08:12:03
谢谢亲爱的!我虽然使用完成块后,我们无法传递任何其他参数,所以我很傻。感谢您快速重播。并感谢你我即将完成我的申请。 – 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);
问题不是这样,但我调用不同的方法,而不是我已修改,但仍然给出的响应为零并且结果为 – UnderGround 2013-05-03 13:35:21
在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);
}];
这样只会把第一个对象列表中,并使其返回(只是以显示它实际返回的东西)。您需要定义一些逻辑来计算异步下载项目。
因为它是在不同线程上运行的renewSession – 2013-05-03 12:59:56
为什么这条线被注释掉了? – Undo 2013-05-03 13:00:00