3

こんにちは。ご協力ありがとうございます。私は探していましたが、これに対する答えを見つけることができませんでした。私は iOS 向けのプログラミングを 1 週間しか行っていません。

これまでのところ、Web サービスへの接続はすべて機能しており、これらの呼び出しを行うためのクラスとメソッドを作成しました。私は標準のログインを作成しています。ユーザーがログイン情報を入力すると、アプリはそれらの値を Web サービスに渡し、情報がデータベース上の何かと一致するかどうかに応じてブール値を返します。その後、アプリは戻り値を取得し、次の画面に移動するか、エラー アラートを表示します。または、少なくともそれが私が目指しているものです。

問題は、残りの呼び出しが行われる前、または応答が解析される前に条件が実行されており、解決策を見つけることがあまりうまくいかないことです。非同期呼び出しと同期呼び出しについて読んだことがありますが、それらを実装するのはあまりうまくいきませんでした。

これは呼び出しコードです:

//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 が発生する前に実行される条件は常に 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

4

1 に答える 1

2

ブロックを渡してから、成功のコールバック内で、ブロックが _result を返す必要があります。

構造に基づく例は次のようになります。

-(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 ラッパーを作成しました。

于 2013-03-06T16:42:17.617 に答える