是否可以在返回BOOL的委托方法中执行API调用?

时间:2013-04-22 16:48:32

标签: ios parsing delegates objective-c-blocks

奇怪的标题,我知道,但这是解释我的问题的最快方式。 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?

谢谢!

2 个答案:

答案 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.
 }

但这不是正确的方法,你必须改变你为支持异步通信而编写的逻辑。你可以考虑我的,只有你想按照自己的方式去做。