2

コード設計の質問があります。これを処理するための最も効率的な方法を考えるのに苦労しています。

基本的に、JSONリクエストを送信し、サーバーからのレスポンスを一度に読み返したいと思います。

私は次のような方法を持っています:

-(BOOL)sendString:(NSString *)sendString;
//This should return a NSString and a BOOL
-(NSDictionary *)loginRequestWithEmail:(NSString *)userEmail andPassword:(NSString     *)userPassword;
//This should return a NSString and a BOOL
-(NSDictionary *)requestNewUserAccountWithDisplayName:(NSString *)displayName Email:    (NSString *)userEmail andPassword:(NSString *)userPassword;

何を説明します

-(BOOL)sendString:(NSString *)sendString;

基本的に、JSON文字列をサーバーに送信し、失敗したかどうかの応答を取得します。

これをサーバーに書き込んで読み取る方法を知っています。問題はこれを一緒に行うことであるため、そのBOOL値をtrueまたはfalseとして返して、機能するかどうかを確認できます。

ソケットに書き込んだ後、応答を受け取り、デリゲートメソッドを介してそれを読み取る必要があります。

-(void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag {

これは、サーバーが応答するとすぐに呼び出されます。問題は、ソケットへのこの読み取り/書き込みがすべて非同期で行われることです。

それが起こるので、私はこれを行う方法を持つことができません:

-(BOOL)sendString:(NSString *)sendString{

NSError *error;

NSLog(@"Sending String: %@",sendString);

NSDictionary *blobData = [NSDictionary dictionaryWithObjectsAndKeys:
                          sendString,@"string",
                          nil];
NSString *blobString = [[NSString alloc]
                        initWithData:[NSJSONSerialization dataWithJSONObject:blobData options:kNilOptions error:&error]
                        encoding:NSUTF8StringEncoding];
NSLog(@"Blob Created: %@", blobString);
NSDictionary *requestData = [NSDictionary dictionaryWithObjectsAndKeys:
                             @"send_string",@"request_type",
                             [NSNumber numberWithInt:0],@"security_level",
                             @"ios",@"device_type",
                             //No Email Provided, This is just for testing
                             blobString,@"blob",
                             nil];

NSData *JSONRequestData = NULL;
JSONRequestData = [NSJSONSerialization dataWithJSONObject:requestData options:kNilOptions error:&error];
        NSLog(@"Contents of JSONRequestData: %@",[[NSString alloc] initWithData:JSONRequestData encoding:NSUTF8StringEncoding]);
JSONRequestData = [[[[NSString alloc] initWithData:JSONRequestData encoding:NSUTF8StringEncoding] stringByAppendingString:@"\\n"] dataUsingEncoding:NSUTF8StringEncoding];
//Write the data
NSMutableData *JSONRequestDataWithLineEnding = [[NSMutableData alloc] initWithData:JSONRequestData];
[JSONRequestDataWithLineEnding appendData:[GCDAsyncSocket CRLFData]];
[asyncSocket writeData:JSONRequestDataWithLineEnding withTimeout:-1 tag:1];

//read a response
[asyncSocket readDataWithTimeout:-1 tag:2];

//This should be done in the didRead delegate
NSString *failure = [serverJSONResponseParsed objectForKey:@"failure"];
NSLog(@"Contents of string failure: %@", failure);

if ([failure isEqualToString:@"none"]) {
    NSLog(@"Success Sending String");
    return TRUE;
}
else {
    NSLog(@"Failure: %@",failure);
    return FALSE;
}

}

後に呼び出されるコード以来

[asyncSocket readDataWithTimeout:-1 tag:2];

データが読み取られる前に実行されます(すべて非同期であるため)。

私はそのデリゲートメソッドで何かをしなければならないことに気づきました。これは問題ありませんが、さまざまな種類の応答があり、それぞれの応答を異なる方法で処理する必要があります。

私の考えは、各書き込みコマンドにタグを付けてから、いくつかを使用することです。

if(this_tag) {do this} ....else if(that_tag) {do this} ....

didReadDataデリゲートメソッドで。

しかし、どうすればこのデータを正しく返すことができますか?BOOLを返す必要がある場合もあれば、NSDictionary、NSStringなどを返す必要がある場合もあります...

上記の各リクエストメソッドで関連データを返すことができるようにしたいと思いますが、できません(少なくとも効率的ではありません)。リクエストごとに2つの異なるメソッドを作成する必要がありますか?

すなわち

sendString
getSendStringResponse

私はこれをどのように扱うかについて少し混乱しています。

はっきりしない場合はお詫び申し上げます。

私は私が得ることができるどんな助けにも感謝します。

4

1 に答える 1

1

私がすることは、この特定のアプリのためにある種のプロトコルを作成することです。たとえば、次のデータ型(Obj-Cとは関係ありません)dat1、dat2、dat3などがあり、このアプリがres1、res2、res3などとして適切な応答を送信して返す必要があるとします。送信部分と応答部分の各データ型の署名を作成します。各データを送信する前に、データの前に署名を付ける必要があります。readDataWithTimeoutを使用する受信側で、didReadDataコールバックメソッドで、受信したデータのヘッダーを抽出し、以前に合意/設計したプロトコルに基づいて応答を決定します。これが完全な設計になる前に、他の追加のステップがあります。たとえば、ヘッダー情報の一部として、データの長さなどの他の情報が含まれている場合があります。

于 2012-08-20T03:05:45.157 に答える