AFHTTPRequestOperationManager没有响应

时间:2015-11-03 09:30:11

标签: ios multithreading apple-push-notifications afnetworking-2

我使用AFNetworking工具包开发iOS应用程序。

当应用程序启动时,它会从服务器请求访问令牌。

代码很简单:

__block int status = 0;
[manager GET:url parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) 
{
    ...fetch access token from response json string
    status = 1;  //break the loop
}
failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    ...networking error
}

并且,为了确保对服务器的其他请求拥有访问令牌,我已经设置了一个循环来阻塞线程,直到服务器响应。

while (status == 0)
{
    [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode
                                 beforeDate:[NSDate date]];
}

之前有效,直到我导入第三方通知推送库。和异步方法:

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken

在控制台中继续打印deviceToken请求,并且访问令牌请求从不响应任何内容,即使服务器实际提供响应。

我被困了一天,有人可以帮助我吗?

更新我试图评论设备令牌的东西,AFNetworking请求仍然不起作用,没有成功没有失败,没有超时:

UPDATE2澄清我的问题。 AFHTTPRequestOperationManager已向服务器和服务器响应发送了GET请求。但是AFHTTPRequestOperationManager没有收到它,也没有成功也没有失败回调。

1 个答案:

答案 0 :(得分:1)

有几点想法:

  1. 如果你打算使用这种模式:

    • 你真的应该在错误块中将status设置为1;以及

    • Apple在其示例中使用distantFuture,而不是date

      [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
      
  2. 您可能还有其他阻止主线程的内容。尝试在NSLog循环中放置while,看看是否看到循环正在运行。如果没有,那么确定你阻止主线程的位置。

  3. 毋庸置疑,这种整体模式效率低下。我建议使用异步模式,例如在您自己的代码中采用完成处理程序:

    - (void)performSomeURL:(NSString *)url completionHandler:(void (^)(NSDictionary *response, NSError *error))completionHandler{
        NSDictionary *parameters = ...;
    
        [manager GET:url parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
            completionHandler(responseObject, nil);
        } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
            completionHandler(nil, error);
        }];
    }
    

    可以被称为:

    [self performSomeURL:url completionHandler:^(NSDictionary *response, NSError *error) {
        // use response and error here
    }];
    
    // but not here
    

    如果你总是在你的所有代码中采用这样的异步模式,从不做任何阻塞主线程的事情,那么你的代码不仅会更高效,而且你永远不必担心主线程上的死锁