【问题标题】:Waiting for block completion to return token nsstring等待块完成返回令牌 nsstring
【发布时间】:2023-03-17 23:50:02
【问题描述】:

我正在编写一个抽象类来从多个社交网络中获取数据。在考虑了我需要在这个类中使用的所有东西之后,在该类的其他子类中使用它是有意义的,我开始编写一个简单的 auth_token 提取器来从 facebook 获取授权以从页面获取所有状态更新轮廓。我没有看到使代码工作的最佳方法是什么:

+ (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;
}

我得到的回报总是为零;

【问题讨论】:

    标签: ios objective-c methods block afnetworking


    【解决方案1】:

    块是异步执行的。所以,你应该在请求函数中传递类的对象。在成功或失败时,block 将使用该对象返回结果。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-06
      • 2011-10-20
      • 2020-04-01
      • 2013-03-22
      • 2016-09-10
      相关资源
      最近更新 更多