ObjectiveC块和变量

Sha*_*man 2 objective-c ios objective-c-blocks

我有以下方法从我的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;
Run Code Online (Sandbox Code Playgroud)

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

__block BOOL valid = NO;
Run Code Online (Sandbox Code Playgroud)

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

Gab*_*lla 5

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

您阻塞是一个异步执行的函数,因此valid将被设置为resp.value每次执行该块时,这很可能发生在您的return语句之后.

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

编辑

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

你的积木变成了

[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);
}];
Run Code Online (Sandbox Code Playgroud)