【问题标题】:Afnetworking success/failure completion block not involved不涉及网络连接成功/失败完成块
【发布时间】:2015-06-18 01:00:59
【问题描述】:

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

【问题讨论】:

    标签: ios objective-c iphone macos afnetworking


    【解决方案1】:

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

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

    因此,您的方法将使用 RunLoop,您基本上在其中循环并检查由延续(完成块)设置的条件“完成”的标志。由于您仅在主线程上读取写入标志,因此不会发生数据竞争 - 也就是说,它应该是线程安全的。

    【讨论】:

    • 您好,感谢您的提示!我已经尝试使用你提到的循环,但仍然没有打印出来,我已经在帖子中更新了我的代码的新版本。可以看看吗?
    【解决方案2】:

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

    main函数返回0,程序结束,操作仍未开始。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多