2

我有以下方法可以从我的 iOS 应用程序(使用 Restkit)进行 Web 服务调用...

BOOL valid = NO;

RKObjectManager *objectManager = [RKObjectManager sharedManager];
NSString *servicePath = [WebServiceHelper pathForServiceOperation:[NSString stringWithFormat:@"/security/isSessionValid/%@", username]];
[objectManager getObjectsAtPath:servicePath parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
    BooleanServiceResponse *resp = [mappingResult firstObject];
    valid = resp.value;
} failure:^(RKObjectRequestOperation *operation, NSError *error) {
    NSLog(@"Error while validating session for user %@ : %@", username, error);
}];

return valid;

但是,我在变量上得到一个错误valid,说它是在块外声明的并且不可分配。我用谷歌搜索了一下,发现了一个我这样声明有效的建议......

__block BOOL valid = NO;

这摆脱了错误。但是,我发现无论我valid在我的块中设置什么值,退出块时都没有正确设置。如何设置此值以便我的方法返回预期值?

4

2 回答 2

5

我想你不明白积木是如何工作的。这不是可变可见性的问题,尽管__block是正确的。

您的 block 是一个异步执行的函数,因此无论何时执行该 blockvalid都会设置为resp.value,这很可能发生在您的 return 语句之后。

您需要更改您的设计,因为到目前为止您正在返回一个不能保证设置的对象。

编辑

例子

- (void)didFinishValidation:(BOOL)valid {
   // Do whatever you like with the `valid` value
   if (valid) {
     //...
   } else {
     //...
   }
}

你的积木变成

[objectManager getObjectsAtPath:servicePath parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
    BooleanServiceResponse *resp = [mappingResult firstObject];
    valid = resp.value;
    [self didFinishValidation:valid];
} failure:^(RKObjectRequestOperation *operation, NSError *error) {
    NSLog(@"Error while validating session for user %@ : %@", username, error);
}];
于 2012-12-29T14:57:22.593 回答
3

通常,需要将变量定义为 __block 以便从块中对其进行变异。这里的问题是在调用块之前调用了“return” - 处理这种情况的最佳方法不是将此方法定义为 - (BOOL)... 而是定义为 - (void)... 并返回通过委托或块回调结果异步。

于 2012-12-29T14:53:08.830 回答