奇怪的标题,我知道,但这是解释我的问题的最快方式。 Parse服务有一个预建的注册控制器,用于让新用户注册您可能拥有的任何服务。没有办法编辑它的实现,你只能处理它的委托方法中的事件。所以我不能把它放在“注册”按钮的IBAction中。我想要做的是,当用户触摸“注册”时,我需要调用一些API来检查是否存在某些内容,然后如果它已经存在则不要让用户签名起来。以下是用于在按下按钮时处理验证的委托方法:
// Sent to the delegate to determine whether the sign up request should be submitted to the server.
- (BOOL)signUpViewController:(PFSignUpViewController *)signUpController shouldBeginSignUp:(NSDictionary *)info {
以下是我想要的内容:
[self processJSONDataWithURLString:[NSString stringWithFormat:@"https://www.someapi.com/api/profile.json?username=%@",username] andBlock:^(NSData *jsonData) {
NSDictionary *attributes = [jsonData objectFromJSONData];
// Check to see if username has data key, if so, that means it already exists
if ([attributes objectForKey:@"Data"]) {
return NO; // Do not continue, username already exists
// I've also tried:
dispatch_sync(dispatch_get_main_queue(), ^{ return NO; } );
}
else
return YES; //Continue with sign up
dispatch_sync(dispatch_get_main_queue(), ^{ return YES; } );
}];
但是当我尝试返回任何内容时,我会收到错误。当我直接返回YES时,“^(NSData * jsonData)”以黄色下划线,我得到“不兼容的块指针类型发送BOOL(^)NSData * _ strong到void类型的参数(^)NSData * _strong”。
基本上,有没有办法在这个方法中进行API调用来检查某些内容,然后根据结果返回YES或NO?
谢谢!
答案 0 :(得分:2)
没有
您正在调用使用该块作为回调的异步方法。调用processJSON…
方法并立即从调用返回。在后台运行后,将调用该块。你无法从街区内“返回”。该方法从堆栈中弹出并返回一段时间。
你需要重新构建这个逻辑。在主队列上调用刷新是正确的方向。
答案 1 :(得分:1)
试试这个:
[self processJSONDataWithURLString:[NSString stringWithFormat:@"https://www.someapi.com/api/profile.json?username=%@",username] andBlock:^(NSData *jsonData) {
NSDictionary *attributes = [jsonData objectFromJSONData];
BOOL status=YES;
// Check to see if username has data key, if so, that means it already exists
if ([attributes objectForKey:@"Data"]) {
status=NO; // Do not continue, username already exists
[self performSelectorOnMainThread:@selector(callDelegate:) withObject:[NSNumber numberWithBool:status] waitUntilDone:YES];
}];
-(void)callDelegate:(NSNumber*) status
{
BOOL returnStatus = [status boolValue];
//now retutn returnStatus to your delegate.
}
但这不是正确的方法,你必须改变你为支持异步通信而编写的逻辑。你可以考虑我的,只有你想按照自己的方式去做。