Iphone 调用API后不等待响应
问题是我调用的是megnto api,但当api在执行所有其他语句之前返回对象时Iphone 调用API后不等待响应,iphone,ios,Iphone,Ios,问题是我调用的是megnto api,但当api在执行所有其他语句之前返回对象时 NSMutableArray *list=[Magento.service startSession]; NSLog(@"Record is:%@",list); 我修改的startSession方法是: - (NSMutableArray *)startSession { NSString *_sessionID; NSNumber *nsPage =[NSNumber numberWit
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 = "indies.tester@gmail.com";
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 = "indies.tester@gmail.com";
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 = "indies.tester@gmail.com";
message = 6tyrtyryrty;
name = "Kaitlyn Matheson";
"phone_no" = 564564;
"product_name" = Ottoman;
"product_options" = "";
"update_time" = "0000-00-00 00:00:00";
},
startSession显示的记录实际上是在call do response之前打印NSLOG。如何解决此问题。s1)在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
array加载表首先分配NSMutableArray,并确保[Magento.service RenewalSession]实际返回数组
NSMutableArray *list = [NSMutableArray array];
list=[Magento.service renewSession];
//[Magento.service getCallForPriceData];
NSLog(@"Record is:%@",list);
我不知道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);
}];
这只会将第一个对象放在列表中并随它一起返回(只是为了显示它实际随某些内容返回)。您还需要定义一些逻辑来计算异步下载的项目。因为它是在不同的线程上运行的会话,为什么有一行被注释掉了?问题不在于,我调用的是不同的方法,而不是我修改过的方法,但仍然给出了response nil,而不是resultp在renewSession方法上放置一个断点,并确保它首先实际创建了数组。您说您修改了该方法以返回一个数组,因此问题很可能就出现在这里。我有一个问题,如何将参数传递给startSession方法我的朋友是哪种类型的参数?如果它是一个字符串,你可以使用这种方法,-(void)startSession:(completion)completion with String:(NSString*)inputstring谢谢亲爱的!!!我想在使用完成块之后,我们不能传递任何其他参数,我真是太傻了。谢谢你的快速重播。谢谢,我即将完成我的应用程序。当我第二次调用此方法时,它会给我带来错误,请首先告诉我,类似NSPlaceHolderDictionary的内容试图将nil对象插入对象[0]