2014-02-18 57 views
1

我正在嘗試爲我們的網站構建一個ios應用程序。我們使用oauth 2.0實現了api。現在,我遇到了設置屬性的問題。我正在使用afnetworking2.0進行聯網。這是我正在嘗試實現的:iOS有問題設置網絡連接2.0成功和失敗中的屬性

我正在編寫的函數將允許我檢查訪問令牌的有效性或使用刷新令牌獲取另一個訪問令牌。我有一個布爾屬性,我在一個頭文件中聲明,告訴我我的訪問令牌是否有效。在向網站發出任何請求之前,我首先請求使用函數檢查訪問令牌的有效性。在這個函數中,我根據令牌是否有效來設置布爾屬性的值。現在,問題是我在afnetworking2.0 post/get request的方法的成功或失敗塊內部設置了這個屬性,並且在進行函數調用後出於某種原因,如果我打印出布爾屬性的值,功能,我沒有看到預期的價值。我已經嘗試了使用__block局部變量的不同方法,然後在函數結束時將布爾屬性設置爲此局部變量,但仍然沒有成功。所以,我有點失落。我所要做的就是實現一種檢查訪問令牌是否有效的方法,以便在向Web服務器發出真正請求之前進行續訂。有沒有更好的方法來做到這一點?我打算採取的第二種方法是存儲access_token的expiry_date,並在提出請求之前檢查時間是否已過。在這種情況下,我將一個額外的請求保存到Web服務器。我只在當前時間通過失效時間時發出續訂請求。但是,我在這裏面臨的問題是在成功塊中設置屬性。這裏是我試圖實現的功能:

- (BOOL) isTokenValid:(NSString *)accessToken 
{ 
    __block BOOL tokenValid = NO; 
    if (accessToken != nil) 
    { 
     static NSString *const baseUrl = @"baseurl"; 

     AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
     manager.securityPolicy.allowInvalidCertificates = YES; 
     manager.requestSerializer = [AFJSONRequestSerializer serializer]; 

     [manager.requestSerializer setValue:[@"Bearer " stringByAppendingString:accessToken] forHTTPHeaderField:@"Authorization"]; 
     [manager.requestSerializer setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 

     [manager GET:baseUrl parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { 
      tokenValid = YES; 
      NSLog(@"Data: %@", responseObject); 

     } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
      tokenValid = NO; 
     }]; 

    } 
    else 
    { 
     tokenValid = NO; 
    } 

    self.tokenValid = tokenValid; // here I am setting the property, which I will be checking right after I call this function 
    return tokenValid; 
} 

正如你所看到的,這是我嘗試的方法之一。我沒有設置'tokenValid',而是嘗試在塊內設置'self.tokenValid',但沒有看到任何運氣。那麼,我將如何在塊內正確設置屬性?

謝謝

回答

1

設置變量沒有問題。它只是在函數返回時才設置,因爲操作是異步的。

+0

任何想法如何我可以改變代碼,以併入我想要的?現在我有'self.tokenValid'作爲屬性。但是,很快我會改變它從這個階級的財產轉變爲單身階層的財產。 – mdhossain

+0

@mdhossain:你不能期望它在這個函數返回的時候被設置。相反,您需要傳遞一個完成處理程序以在該操作完成時執行,並且它具有tokenValid的值,並且完成處理程序可以採用tokenValid的值。調用者將在完成處理程序中將tokenValid所需的任何內容放入。 – newacct

+0

我在完成有關塊的教程以及如何將它們用作completionHandler之後,明白了completionHandler的含義。問題已經解決了。接受你的答案。謝謝 – mdhossain