Ios 使用RestKit进行同步HTTP调用

Ios 使用RestKit进行同步HTTP调用,ios,restkit,objective-c-blocks,Ios,Restkit,Objective C Blocks,在将用户登录到我的应用程序时,我需要仅使用用户名从服务器上下拉一个用户对象。这将返回进行其他API调用所需的用户ID(以及其他内容)。从那时起,我将使用userId进行另外几个HTTP调用。在发送其他调用之前,如何进行同步调用以完全下拉用户对象 我已经在我的app delegate类中设置了我的对象映射,该类工作得非常好,我正在使用以下代码从服务器上下拉用户对象: [[RKObjectManager sharedManager] loadObjectsAtResourcePath:[@"/api

在将用户登录到我的应用程序时,我需要仅使用用户名从服务器上下拉一个用户对象。这将返回进行其他API调用所需的用户ID(以及其他内容)。从那时起,我将使用userId进行另外几个HTTP调用。在发送其他调用之前,如何进行同步调用以完全下拉用户对象

我已经在我的app delegate类中设置了我的对象映射,该类工作得非常好,我正在使用以下代码从服务器上下拉用户对象:

[[RKObjectManager sharedManager] loadObjectsAtResourcePath:[@"/api/users/" stringByAppendingString:[_userNameField text]] delegate:self];
这就是我试过的。。。正如这里所建议的:


但是,这段代码(1)使用了不推荐使用的objectLoaderForObject方法,并且(2)对HTTP方法“POST”“找不到类型为“(null)”的对象的可路由路径。”

抛开这是否是iPhone应用程序的理想设计这一问题不谈,我能够用Block实现我所希望的

[[RKObjectManager sharedManager] loadObjectsAtResourcePath:[@"/api/users/" stringByAppendingString:[_userNameField text]] usingBlock:^(RKObjectLoader* loader) {

    loader.onDidLoadResponse = ^(RKResponse *response) {

        NSLog(@"Response: \n%@", [response bodyAsString]);
    };

    loader.onDidLoadObjects = ^(NSArray *objects) {

        APIUser *apiUser = [objects objectAtIndex:0];
        NSLog(@"user_id is %i", apiUser.user_id);


    };

    loader.onDidFailWithError = ^(NSError *error) {


            UIAlertView *badLoginAlert = [[UIAlertView alloc]initWithTitle:NSLocalizedString(@"LOGIN_FAILED", nil)
                                                                   message:NSLocalizedString(@"BAD PASSWORD OR USERNAME", nil)
                                                                  delegate:self
                                                         cancelButtonTitle:NSLocalizedString(@"OK", nil)
                                                         otherButtonTitles:nil];
            [badLoginAlert show];           
    };
}];

希望这对其他人有所帮助。

抛开这是否是iPhone应用程序的理想设计这一问题不谈,我能够用Block实现我所希望的

[[RKObjectManager sharedManager] loadObjectsAtResourcePath:[@"/api/users/" stringByAppendingString:[_userNameField text]] usingBlock:^(RKObjectLoader* loader) {

    loader.onDidLoadResponse = ^(RKResponse *response) {

        NSLog(@"Response: \n%@", [response bodyAsString]);
    };

    loader.onDidLoadObjects = ^(NSArray *objects) {

        APIUser *apiUser = [objects objectAtIndex:0];
        NSLog(@"user_id is %i", apiUser.user_id);


    };

    loader.onDidFailWithError = ^(NSError *error) {


            UIAlertView *badLoginAlert = [[UIAlertView alloc]initWithTitle:NSLocalizedString(@"LOGIN_FAILED", nil)
                                                                   message:NSLocalizedString(@"BAD PASSWORD OR USERNAME", nil)
                                                                  delegate:self
                                                         cancelButtonTitle:NSLocalizedString(@"OK", nil)
                                                         otherButtonTitles:nil];
            [badLoginAlert show];           
    };
}];

希望这对某人有所帮助。

这不是一个好的设计。永远不要对web服务器进行同步调用。如果你首先需要这些信息,你的应用程序应该处理没有信息的情况(例如没有互联网连接),当信息到达时(代表或观察员等),这不是一个好的设计。永远不要对web服务器进行同步调用。如果您首先需要这些信息,您的应用程序应该处理没有信息的情况(例如没有互联网连接),并且当信息到达时(代表或观察员等)+2对于带有块的示例,-1对于设计问题=+1正如我所指出的,这不是一个理想的方法。在某些无法更改后端API的情况下,这可能会对您有所帮助。我同意,对于一般应用程序来说,这不是一个好主意,但同步调用确实会使您的测试单元更易于编程。+2对于带有块的示例,-1对于设计问题=+1正如我所指出的,这不是一种理想的方法。在某些无法更改后端API的情况下,这可能会对您有所帮助。我同意对于一般应用程序来说,这不是一个好主意,但同步调用确实使您的测试单元更易于编程。