0

私はいくつかのURLと本文でポストリクエストを送信してjsonデータのみにしようとしています(次のようにjsonを送信する新しいユーザーを登録しようとしています)

{
    "username": "test",
    "password": "test",
    "email": "email@gmail.com"
}

私は次のような機能を持っています

-(NSString*) sendPostOnUrl:(NSString*) url
            withParameters:(NSDictionary*)params{
    __block NSString* response = nil;
    NSError *error;
    NSURL *u = [NSURL URLWithString:url];
    AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL: u];

    [httpClient postPath:REGISTER
              parameters:params
                 success:^(AFHTTPRequestOperation *operation, id responseObject) {
                     response = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
                     NSLog(@"Request Successful, response '%@'", response);
                 } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
                     NSLog(@"[HTTPClient Error]: %@", error.localizedDescription);
                 }];
    return response;
}

ここで、params は NSDictionary で、キーのユーザー名、パスワード、電子メール、およびそれらのキーの値を指定します。問題は、送信すると常に応答で null が返されることです (最新の行) が、NSLog では json 応答が返されます。関数からですが、方法がわかりません。何が間違っているのか、誰かが私に手がかりを与えることができますか? (デバッグしようとすると、paramsにはこれらすべてのキーが含まれます。URLは問題ありません。REGISTERはNSString定数です)

4

1 に答える 1

1

ブロックは非同期です。ここでの問題は、「response = [[NSString alloc] initWithData...」が、メソッドを終了した後に実行されるブロック内にあることです。より良いアプローチは、メソッドでこれを行うのではなく、 sendPostOnUrl:withParameters: を呼び出していた場所にこのコードを配置し、成功ブロック内で必要なことは何でも行うことです。したがって、代わりに:

self.something = [self sendPostOnUrl:url withParameters:@{"username":"test" etc}];

これをして:

NSError *error;
NSURL *u = [NSURL URLWithString:url];
AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL: u];
__weak YourClassName *me = self;
[httpClient postPath:REGISTER
          parameters:params
             success:^(AFHTTPRequestOperation *operation, id responseObject) {
                 me.something = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
                 NSLog(@"Request Successful, response '%@'", response);
             } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
                 NSLog(@"[HTTPClient Error]: %@", error.localizedDescription);
             }];

また、「__weak YourClassName *me = self」に注意してください。リテイン サイクルが発生するため、ブロック内で self を参照することはできません。

于 2013-02-14T03:36:40.133 に答える