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