2013-12-09 85 views
0

我正在編寫一個抽象類來從多個社交網絡獲取數據。在考慮了所有需要在這個類中使用的東西之後,在該類的其他子類中使用它之後,我開始編寫一個簡單的auth_token提取器,以從facebook獲得授權以從頁面獲取所有狀態更新個人資料。我沒有看到什麼是最好的方法來使代碼工作:等待塊完成返回標記nsstring

+ (NSString *)requestAuthToken { 
    NSString *authTokenKey = [[self socialNetworkName] stringByAppendingString:@"AuthToken"]; 
    NSString *authTokenDateKey = [[self socialNetworkName] stringByAppendingString:@"AuthTokenDate"]; 
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 
    __block NSString *authToken = [userDefaults stringForKey:authTokenKey]; 
    NSDate *authTokenDate = (NSDate*)[userDefaults objectForKey:authTokenDateKey]; 
    NSTimeInterval expirationDate = [authTokenDate timeIntervalSinceNow]; 
    NSTimeInterval now = [[NSDate date] timeIntervalSinceNow]; 
    NSTimeInterval dateDiff = expirationDate - now; 
    int diff = roundf(dateDiff/(60 * 60 * 24)); 

    if (authToken == nil|| diff >= kMaxDaysExpiratonForAuthToken) { 
     DLog(@"AuthToken not Cached, requesting token with %@", [self socialNetworkName]); 
     AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:[self socialNetworkAPIURL]]]; 
     NSDictionary *parameters = [self socialNetworkAPIAuthTokenParameters]; 
     [httpClient getPath:[self socialNetworkAPIAuthTokenURLPath] parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) { 
      authToken = [NSString stringWithUTF8String:[responseObject bytes]]; 
      [userDefaults setObject:[NSDate date] forKey:authTokenDateKey]; 
      [userDefaults setObject:authToken forKey:authTokenKey]; 
//   [userDefaults synchronize]; 
     } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
      DLog(@"error requesting the token %@", error); 
     }]; 
    } 

    return authToken; 
} 

我得到的回報總是n;

回答

4

塊異步執行。所以,你應該在請求函數中傳遞類的對象。在成功或失敗時,塊將使用該對象返回結果。

+ (NSString *)requestAuthToken:(id)objOfCallerClass { 
....  
     if (authToken == nil|| diff >= kMaxDaysExpiratonForAuthToken) { 
.... 
[objOfCallerClass accessToken: authToken]; 
      } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
       [objOfCallerClass accessToken: nil]; 
      }]; 
     } 

     return authToken; 
    }