1

我正在使用AFNetworking套件开发iOS应用程序。AFHTTPRequestOperationManager没有响应

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

的代码也很简单:

__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请求和访问令牌请求从不响应任何东西,甚至服务器实际上提供的响应。

我一直坚持一天,有人可以帮助我吗?

UPDATE我试图评论的设备令牌的东西,在AFNetworking要求仍然不能正常工作,没有成功没有失败,没有超时:

UPDATE2澄清我的问题。 AFHTTPRequestOperationManager已经发送了一个GET请求到服务器和服务器响应。但AFHTTPRequestOperationManager没有收到它,并没有成功没有失败回调以及。

回答

1

一对夫妇的想法:

  1. 如果你要使用这个模式:

    • 你真的应该设置status1错误块,太;和

    • 苹果在它的例子使用distantFuture,不date

      [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]; 
      
  2. 你可能有别的东西阻塞主线程。尝试在while循环内部放置NSLog并查看是否看到该循环正在运行。如果不是,那么确定你阻止主线程的位置。

  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 
    

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

+0

我把nslog放在循环中,但只打印一次。我认为有一些东西阻塞了主线程,我会将代码更改为异步方式。谢谢 – Mix