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在块中设置了什么值,退出块时都没有正确设置.如何设置此值以使我的方法返回预期值?
我想你不明白块是如何工作的.这不是可变可见性的问题,尽管__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)