我有一些代码可以对基于json的webservice进行http调用。这工作正常,但我试图将代码移动到它自己的类,我有一个轻微的挂断。当我调用该方法时,主线程只是继续执行下一个命令而不等待我的方法的响应。
以下是程序主要部分的一些代码
[newcall run];
NSLog(@"%@",[newcall status]);
NSArray *resultarray= [newcall returndata];
for (NSString *element in resultarray) {
NSLog(@"%@",element);
}
我的标题
#import "AFHTTPClient.h"
@interface jsoncall : AFHTTPClient
{
NSString* Date;
NSString* apps;
NSString* data1;
NSURL* url;
NSString* Path;
NSArray* returndata;
NSString* status;
}
-(void) setApp: (NSString *)input;
-(void) setData: (NSString *)input;
-(void) setURL: (NSString *)input;
-(void) setPath: (NSString *)input;
-(int) run;
-(NSArray *) returndata;
-(NSString *) status;
@end
我的跑步方法
-(int) run
{
__block int success;
NSDictionary* jsonDictionary=[NSDictionary dictionaryWithObject: data1 forKey:@"data"];
NSString* jsonString = [jsonDictionary JSONRepresentation];
AFHTTPClient *httpClient=[[AFHTTPClient alloc] initWithBaseURL:url];
NSDictionary *params =[NSDictionary dictionaryWithObjectsAndKeys:
apps,@"app",
jsonString,@"smpdata",nil];
NSMutableURLRequest *request = [httpClient requestWithMethod:@"POST" path:Path parameters:params];
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request
success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
NSArray *dataarray=[JSON valueForKey:@"Data"];
status= [NSString stringWithFormat:@"%@",[JSON valueForKeyPath:@"Status"]];
NSLog(@"%@",status);
returndata= dataarray;
success=1;
NSLog(@"Success: Made it here");
}
failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error,id JSON)
{
success=0;
NSLog(@"Error: Made it here");
}
];
[operation start];
[operation waitUntilFinished];
return success;
}
答案 0 :(得分:-1)
我使用的方法是Asychronous,因此我必须通过从完成块调用它来链接下一组处理。当最终的应用程序完成后,我们可能会这样做,但也有这个解决方案。
Waiting for completion block to complete in an AFNetworking request
通过将AFJSONRequestOperation切换到NSURLConnection,我可以使用同步模式,这意味着必须在线程移动之前完成请求。
NSMutableURLRequest *request = [httpClient requestWithMethod:@"POST" path:Path parameters:params];
NSURLResponse *response = nil;
NSError *error = nil;
NSData *data=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
if (error) {
NSLog(@"Error: %@",error);
}
else {
id JSON = AFJSONDecode(data, &error);
NSArray *dataarray=[JSON valueForKey:@"Data"];
status= [NSString stringWithFormat:@"%@",[JSON valueForKeyPath:@"Status"]];
NSLog(@"%@",status);
returndata= dataarray;
}
对于我们的需求同步模式现在应该可以正常工作。
<强>然而强>
您不应该在UI线程上运行同步Web调用,因为它会阻止并使您的UI无响应。这意味着你需要将它的调用放在它自己的线程中,并使用任何其他依赖它的代码。我相信你想查看NSOperation的使用,但我是一个Objective-c菜鸟,所以我不想在这里添加一个例子。