1

私のアプリの一部は、ユーザーに提供された一意のコードに基づいて、ユーザーのログイン チェックを作成します。アプリケーションを適切に構造化するために、すべてのネットワーク操作を処理するネットワーク ヘルパー クラスを作成しました。コントローラー クラス (ViewController.m) からヘルパー クラスを呼び出す方法を次に示します。

[[LoginNetworkHelper alloc] loginBasedOnPatientId:@"abc"];

私の LoginNetworkHelper クラスは次のタスクを実行します (LoginNetworkhelper.m)

- (BOOL)loginBasedOnPatientId:(NSString *)patientId
{
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://test.php"]];
        [request setHTTPMethod:@"POST"];

        //creating json string to send to server
        NSDictionary *patientData = [NSDictionary dictionaryWithObjectsAndKeys:@"002688727",@"value",@"prem_key_id",@"name", nil];
        NSMutableArray *dataArr = [[NSMutableArray alloc] init];
        [dataArr addObject:patientData];
        NSError *error;
        NSData *jsonData2 = [NSJSONSerialization dataWithJSONObject:dataArr options:NSJSONWritingPrettyPrinted error:&error];
        NSString *jsonString = [[NSString alloc] initWithData:jsonData2 encoding:NSUTF8StringEncoding];
        NSString *postData = [NSString stringWithFormat:@"message=%@",jsonString];

        [request setHTTPBody:[postData dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]];
        NSURLSessionDataTask *dataTask = [self.session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
           NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
            NSLog(@"%@",json);
        }];
        [dataTask resume];
        return TRUE;
}

したがって、私の基本的な質問は、完了ハンドラーNSURLSessionと、ログインのビューにリンクされているコントローラー クラスとの間で通信する方法です。非同期で実行される完了ハンドラーからのみアクセスできるサーバーから返されたデータに基づいて、メイン ビューで何かを変更する必要があります。呼び出されたメインコントローラーのオブジェクトを参照しながら、すべてのネットワークタスクを管理するより良い方法はありますか? 前もって感謝します

4

1 に答える 1

3

LoginNetworkHelper.h クラスにプロトコルを追加することで、通信を実現できます。

@protocol LoginNetworkHelperResponseDelegate <NSObject>
@required
-(void)didFininshRequestWithJson:(NSDictionary *)responseJson;
@end

デリゲート変数を LoginNetworkHelper.h クラスに追加します

@property (nonatomic,strong) NSObject < LoginNetworkHelperResponseDelegate > *delegate;

次のコードを完了ハンドラに追加します。

NSURLSessionDataTask *dataTask = [self.session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
       NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
       //Code Added Start
       [self.delegate didFininshRequestWithJson:json];
       //Code Added Ends
        NSLog(@"%@",json);
    }];

ViewController.h では、プロトコルに準拠するだけです

@inteface ViewController:UIViewController<LoginNetworkHelperResponseDelegate>
…
@end

ViewController.m にプロトコル メソッド didFinnshRequestWithJson:responseJson を実装します。

-(void)didFininshRequestWithJson:(NSDictionary *)responseJson
{
  //Process the responseJson;
}

次のコードを実装して、LoginRequest を開始します。

LoginNetworkHelper *loginNetHelper = [[LoginNetworkHelper alloc]init];
loginNetHelper.delegate = self;
[loginNetHelper loginBasedOnPatientId:@"abc"];

Completion Handler が呼び出されるとすぐに、受信した json 応答で Delegate メソッドを呼び出します。これは、通知を使用して実現することもできます。

問題が発生した場合はお知らせください。

よろしく、

アミット

于 2014-08-25T12:45:27.963 に答える