2
- (NSString *) BBB {
    __block NSString *returnValue;

    NSDictionary *queryParameters = @{ @"q" : @"SELECT uid FROM user WHERE uid = me()"};
    [FBRequestConnection startWithGraphPath:@"fql" parameters:queryParameters HTTPMethod:@"GET" completionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
        returnValue = result[@"data"][0][@"uid"];
        NSLog(@"inside block -> %@", returnValue);
    }];

    return returnValue;
}

我想返回正确的值,但FBRequestConnection它是一个异步请求。那是returnValueis (null) 的 make 值,因为它是在执行 FBRequestConnection 的 completionBlock 之前返回的。

4

1 回答 1

2

如果您需要将该值返回给特定方法,一个简单的解决方案可能是将依赖该值的代码移动到其他方法。您也可以考虑设置一个等待指示器。在这种情况下,用户将知道操作正在运行。

- (void)BBB {    

    __weak SelfType weakSelf = self; // to prevent possible memory leaks if you use ARC

    NSDictionary *queryParameters = @{ @"q" : @"SELECT uid FROM user WHERE uid = me()"};
    [FBRequestConnection startWithGraphPath:@"fql" parameters:queryParameters HTTPMethod:@"GET" completionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
        returnValue = result[@"data"][0][@"uid"];
        NSLog(@"inside block -> %@", returnValue);

        __strong SelfType safeSelf = weakSelf;
        if(safeSelf) {
            // notify that the operation is finished
            [safeSelf DDDWithReturnValue:returnValue];
        }
    }];
}

我提供的代码在 ARC 下工作。如果您的代码未启用 ARC,请使用

__block SelfType weakSelf = self; // for non-ARC code
于 2013-03-31T20:42:53.040 回答