AFNetworking没有发送请求

时间:2014-12-27 12:59:06

标签: objective-c afnetworking afnetworking-2

我试图通过尝试创建一个简单的命令行应用程序来学习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;
}

1 个答案:

答案 0 :(得分:2)

请求以异步方式运行,因此main函数结束,因此应用程序在请求完成之前终止。

您需要运行NSRunLoop才能使应用保持活跃状态​​并正确处理AFNetworking的NSURLConnection事件。最简单的方法是不使用命令行应用程序,而是使用标准的Cocoa或Cocoa Touch应用程序,并在适当的位置启动AFHTTPRequestOperationNSRunLoop将继续运行,应用程序不会立即终止,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;
}