不涉及Afnetworking成功/失败完成块

时间:2015-04-12 18:38:05

标签: ios objective-c iphone macos afnetworking

我尝试使用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;
}

2 个答案:

答案 0 :(得分:0)

是的,因为程序在操作开始之前退出,所以不会调用它们。

主函数返回0,程序结束,操作仍未启动。

您需要阅读有关异步块的更多信息。

答案 1 :(得分:0)

在控制台测试应用程序中解决此问题(具有异步功能和延续)的常用且简单的方法将利用您在主函数中等待的信号量,然后退出并在延续中释放它,在其他一些线程上。现在,在等待信号量时,主线程将被阻塞,直到信号量在继续运行时被释放。很简单。

但是,如果要在控制台应用程序中尝试AFN,则不起作用。您需要使用run loop,这会增加一些不受欢迎的复杂性,以便运行这个简单的测试应用程序。这是不幸的,并且源于AFN在线程上执行其延续的简单事实。恕我直言,这是一个非常糟糕的设计决定,它可能会导致死锁(就像你的情况一样)并且效率也会降低。

因此,您的方法将使用RunLoop,您基本上循环并检查条件的标志" done"由continuation(完成块)设置。由于您只是在主线程上阅读标记,因此您不会获得数据竞争 - 也就是说,它应该是线程安全的。