我尝试使用afnetworking进行简单测试,但似乎根本没有触发成功/失败blcok,是否有任何我忘记设置的内容?
我的代码如下:
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSString *string = [NSString stringWithFormat:@"%@weather.php?format=json", BaseURLString];
NSURL *url = [NSURL URLWithString:string];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
operation.responseSerializer = [AFJSONResponseSerializer serializer];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"Succeed!");
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Fail");
}];
[operation start];
}
return 0;
}
更新:我尝试使用循环a等待操作执行并打印出来,但没有打印出来。这是我的更新版本
int main(int argc, const char * argv[]) {
@autoreleasepool {
__block bool result = false;
NSString *string = [NSString stringWithFormat:@"%@weather.php?format=json", BaseURLString];
NSURL *url = [NSURL URLWithString:string];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
operation.responseSerializer = [AFJSONResponseSerializer serializer];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"Succeed!");
result = true;
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Fail");
result = true;
}];
[operation start];
while (1) {
if (result) {
break;
}
}
}
return 0;
}
答案 0 :(得分:0)
是的,因为程序在操作开始之前退出,所以不会调用它们。
主函数返回0,程序结束,操作仍未启动。
您需要阅读有关异步块的更多信息。
答案 1 :(得分:0)
在控制台测试应用程序中解决此问题(具有异步功能和延续)的常用且简单的方法将利用您在主函数中等待的信号量,然后退出并在延续中释放它,在其他一些线程上。现在,在等待信号量时,主线程将被阻塞,直到信号量在继续运行时被释放。很简单。
但是,如果要在控制台应用程序中尝试AFN,则不起作用。您需要使用run loop,这会增加一些不受欢迎的复杂性,以便运行这个简单的测试应用程序。这是不幸的,并且源于AFN在主线程上执行其延续的简单事实。恕我直言,这是一个非常糟糕的设计决定,它可能会导致死锁(就像你的情况一样)并且效率也会降低。
因此,您的方法将使用RunLoop,您基本上循环并检查条件的标志" done"由continuation(完成块)设置。由于您只是在主线程上阅读标记,因此您不会获得数据竞争 - 也就是说,它应该是线程安全的。