ObjectiveC块和variables

我有以下方法,使我的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; 

但是,我在validvariables上得到一个错误,说它是在块之外声明的,并且是不可赋值的。 我search了一下,发现了一个build议,我宣布这样的有效,而不是…

 __block BOOL valid = NO; 

这摆脱了错误。 但是,我发现无论我在块中设置了valid ,在退出块时都没有适当的设置。 我怎样才能设置这个值,所以我的方法返回预期的值?

我想你不明白块是如何工作的。 这不是一个可变的可见性的问题,虽然__block是正确的。

你的block是一个asynchronous执行的函数,所以无论何时该块被执行,这个valid都会被设置为resp.value ,这很可能比你的return语句晚。

你需要改变你的devise,因为到目前为止你正在返回一个不能保证被设置的对象。

编辑

 - (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); }]; 

通常需要将variables定义为__block,以便在块内对它们进行变异。 这里的问题是在调用块之前调用“return” – 处理这种情况的最好方法不是将此方法定义为 – (BOOL)…而是 – (void)…并返回通过委托或阻止callback导致asynchronous。