我试图通过尝试创建一个简单的命令行应用程序来学习AFNetworking。根本没有网络请求。我使用charles代理来查看是否正在向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;
}
答案 0 :(得分:2)
请求以异步方式运行,因此main
函数结束,因此应用程序在请求完成之前终止。
您需要运行NSRunLoop
才能使应用保持活跃状态并正确处理AFNetworking的NSURLConnection
事件。最简单的方法是不使用命令行应用程序,而是使用标准的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;
}