我试图通过尝试创建一个简单的命令行应用程序来学习AFNetworking。根本没有发出网络请求。我使用查尔斯代理来查看是否对api服务器进行了任何请求,但均未做出任何请求。有指针吗?
#import <Foundation/Foundation.h>
#import <AFNetworking/AFNetworking.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSString * BaseURLString = @"http://api.erail.in/pnr?key=599c6647e&pnr=673607";
NSURL *url = [NSURL URLWithString:BaseURLString];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
operation.responseSerializer = [AFJSONResponseSerializer serializer];
NSLog(@"Hi!");
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
NSDictionary *status = (NSDictionary *) responseObject;
NSLog(@"HI!");
NSLog(@"%@", status);
}
failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Couldn't reciev the data");
}
];
[operation start];
}
return 0;
}
该请求是异步运行的,因此该main
功能将在请求完成之前结束,因此该应用程序将终止。
您需要NSRunLoop
运行以保持应用程序正常运行并NSURLConnection
正确处理AFNetworking的事件。最简单的方法是不使用命令行应用程序,而是使用标准的Cocoa或Cocoa Touch应用程序,然后AFHTTPRequestOperation
在适当的位置启动。该NSRunLoop
会继续运行,应用程序将不会立即终止,并AFNetworking的NSURLConnection
将有机会来处理请求,并等待响应。
如果您真的想做一个命令行应用程序,那么您可以自己保持运行循环:
int main(int argc, const char * argv[]) {
@autoreleasepool {
BOOL __block done = NO;
NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
AFHTTPRequestOperation *operation = ...
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
// do your success stuff
done = YES;
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
// do your failure stuff
done = YES;
}];
[operation start];
while (!done && [runLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]) {
// this is intentionally blank
}
}
return 0;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句