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;
但是,我在valid
variables上得到一个错误,说它是在块之外声明的,并且是不可赋值的。 我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。
- UISearchDisplayController不正确显示自定义单元格
- Xcode 9 – 本地化问题警告故事板
- 行分隔符上的标签 – Swift Tableview – 每小时日历
- 我如何使用5台iDevice弹钢琴(MultipeerConnection框架)
- 在没有NSNotificationCenter的iOS 8中正确强制或允许Youtubeembeddedvideo的横向模式
- iOS NSXMLParsing未成形的HTML
- 带有客户端身份validation的GCDAsyncSocket
- 如何使用命令行上传到iTunesConnect时指定应用程序ID
- UIDatePicker限制小时但不限制日期