Ios 目标-c+;RestKit-在下一步之前等待响应

Ios 目标-c+;RestKit-在下一步之前等待响应,ios,objective-c,asynchronous,restkit,Ios,Objective C,Asynchronous,Restkit,您好,提前感谢您的帮助。我一直在找,但找不到答案。我只为iOS编程了一个星期 到目前为止,所有与web服务的连接都正常工作,我已经创建了一个类和方法来执行这些调用。我正在进行标准登录,用户输入登录信息,应用程序将这些值传递给web服务,并根据信息是否与数据库中的任何内容匹配返回布尔值。之后,应用程序获取返回值并移动到下一个屏幕或显示错误警报。至少这是我的目标 问题是,条件是在rest调用或响应解析之前执行的,我没有多少运气找到解决方案。我读过异步和同步调用,但在实现它们方面运气不好 这是呼叫代码

您好,提前感谢您的帮助。我一直在找,但找不到答案。我只为iOS编程了一个星期

到目前为止,所有与web服务的连接都正常工作,我已经创建了一个类和方法来执行这些调用。我正在进行标准登录,用户输入登录信息,应用程序将这些值传递给web服务,并根据信息是否与数据库中的任何内容匹配返回布尔值。之后,应用程序获取返回值并移动到下一个屏幕或显示错误警报。至少这是我的目标

问题是,条件是在rest调用或响应解析之前执行的,我没有多少运气找到解决方案。我读过异步和同步调用,但在实现它们方面运气不好

这是呼叫代码:

//Class that has the methods for calling the web services
__restObj  = [[restCalls alloc] init];
bool login = [__restObj restLogin:user passwd:pass];
if (login) {
   [self performSegueWithIdentifier:@"adminLogin" sender:self];
}
else{
   UIAlertView*alert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Incorrect group name or password." delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
   [alert show];
}
在实际POST发生之前执行的条件in,并且始终存在false

这是我的方法:

- (bool)restLogin:(NSString*)user passwd:(NSString*)pass{
// Load the object model via RestKit
RKObjectManager *objectManager = [RKObjectManager sharedManager];

groupInfo *gi = [[groupInfo alloc] init];

gi.gName = user;
gi.pass = pass;


RKObjectMapping *userInfoMapping = [RKObjectMapping requestMapping];
[userInfoMapping addAttributeMappingsFromDictionary:@{@"gName": @"groupName",@"pass":@"pass"}];

RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:userInfoMapping
                                                                               objectClass:[groupInfo class]
                                                                               rootKeyPath:nil];
[objectManager addRequestDescriptor:requestDescriptor];
objectManager.requestSerializationMIMEType = RKMIMETypeJSON;

[objectManager postObject:gi
                     path:@"adminLoginIos"
               parameters:nil
                  success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
                      NSArray* statuses = [mappingResult array];
                      NSLog(@"Loaded statuses: %@", statuses);
                      _result = [statuses objectAtIndex:0];
                  }
                  failure:^(RKObjectRequestOperation *operation, NSError *error) {
                      NSLog(@"Hit error: %@", error);
                  }
 ];

return _result;
}
提前谢谢,请记住我在这方面是新手,所以我感谢你的帮助,如果我的代码不是最好的,请告诉我

问候,,
ChmlGr

您需要传入一个块,然后在成功回调中,块返回_结果

基于您的结构的示例如下:

-(void) restLogin:(NSString*)user passwd:(NSString*)pass block:(void (^)(id))block {
    // Load the object model via RestKit
    RKObjectManager *objectManager = [RKObjectManager sharedManager];

    groupInfo *gi = [[groupInfo alloc] init];

    gi.gName = user;
    gi.pass = pass;


    RKObjectMapping *userInfoMapping = [RKObjectMapping requestMapping];
    [userInfoMapping addAttributeMappingsFromDictionary:@{@"gName": @"groupName",@"pass":@"pass"}];

    RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:userInfoMapping
                                                                                   objectClass:[groupInfo class]
                                                                                   rootKeyPath:nil];
    [objectManager addRequestDescriptor:requestDescriptor];
    objectManager.requestSerializationMIMEType = RKMIMETypeJSON;

    [objectManager postObject:gi
                         path:@"adminLoginIos"
                   parameters:nil
                      success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
                          NSArray* statuses = [mappingResult array];
                          NSLog(@"Loaded statuses: %@", statuses);
                          _result = [statuses objectAtIndex:0];
                          block(_result);
                      }
                      failure:^(RKObjectRequestOperation *operation, NSError *error) {
                          NSLog(@"Hit error: %@", error);
                          block(nil);
                      }
     ];

}
[__restObj restLogin:user passwd:pass block:^(id obj) {
    // do something here to translate that object into a BOOL and check value    
}];
您对该方法的调用类似于:

-(void) restLogin:(NSString*)user passwd:(NSString*)pass block:(void (^)(id))block {
    // Load the object model via RestKit
    RKObjectManager *objectManager = [RKObjectManager sharedManager];

    groupInfo *gi = [[groupInfo alloc] init];

    gi.gName = user;
    gi.pass = pass;


    RKObjectMapping *userInfoMapping = [RKObjectMapping requestMapping];
    [userInfoMapping addAttributeMappingsFromDictionary:@{@"gName": @"groupName",@"pass":@"pass"}];

    RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:userInfoMapping
                                                                                   objectClass:[groupInfo class]
                                                                                   rootKeyPath:nil];
    [objectManager addRequestDescriptor:requestDescriptor];
    objectManager.requestSerializationMIMEType = RKMIMETypeJSON;

    [objectManager postObject:gi
                         path:@"adminLoginIos"
                   parameters:nil
                      success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
                          NSArray* statuses = [mappingResult array];
                          NSLog(@"Loaded statuses: %@", statuses);
                          _result = [statuses objectAtIndex:0];
                          block(_result);
                      }
                      failure:^(RKObjectRequestOperation *operation, NSError *error) {
                          NSLog(@"Hit error: %@", error);
                          block(nil);
                      }
     ];

}
[__restObj restLogin:user passwd:pass block:^(id obj) {
    // do something here to translate that object into a BOOL and check value    
}];
我不使用RestKit,所以我无法验证这是否正是您所需要的,但它应该会让您走上正确的道路。也就是说,如果你想查看AFNetworking,我写了一个NetworkClient包装器,我不介意分享