0

人々がこれを尋ねてきたことは知っていますが、満足のいく答えは見つかりませんでした. すべての URLRequest を送信するメソッドが 1 つあります。メソッドが完了すると、リクエストのレスポンスを文字列として返します。最近、自分のプログラムに ssl を追加しました。これは、資格情報が現在自己署名しているため、didReceiveAuthenticationChallenge 関数を利用する必要があるため、同期要求を使用できなくなったことを意味します。プログラムは続行するために URL からの応答を必要とするため、応答を待っても害はありません。ただし、コードを保持して完了したら続行する方法を見つけることができないようです。関数を要求するために呼び出された元の関数にアラートを出すことはできますが、その呼び出しの直後にプログラムが応答するようにしたいと考えています。

プログラムを一時停止して、接続からそれを呼び出したメソッドに nsdata を返すにはどうすればよいですか?

ここに、私が何を意味するかを示すための疑似コードをいくつか示します。

- (void) login:(NSString *)username :(NSString *)password {
     NSString *str = [NSString stringWithFormat:%@"%@:::%@",username,password];
     NSURL *url = [NSURL urlWithString:@"https://blahblahblah"];
     NSString *result = [self connectToUrl:str:url];
     if ([result isEqualToString:@"valid"]) {
           //this would be more complex in here
           NSLog(@"hooray");
     } else {
           NSLog(@"bummer");
    }
}


- (NSString *)connectToUrl:(NSURL *)url :(NSString *)str {

     NSData *FileData = [str dataUsingEncoding: NSUTF8StringEncoding];



    NSMutableData *data = [[NSMutableData alloc] initWithCapacity:100];
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
    [request setHTTPMethod:@"POST"];

    //set up the rest of the request...

     ...

    connection = [NSURLConnection connectionWithRequest:request delegate:self];
   [connection start];

    //WOULD LIKE TO PAUSE HERE UNTIL COMPLETE!  THEN CONTINUE

    // received data is assigned in didReceiveData: method
    return [[[NSString alloc] initWithData:receivedData encoding:NSUTF8StringEncoding] autorelease];  

}

しかし、残念ながら、接続が完了するまで最後の行を待たせることができないため、これを行うことができません...助けてください!

とても感謝しています!

R

4

1 に答える 1

3

iOS と OS X、および Cocoa/Cocoa タッチ フレームワークの多くは、イベント モデルに基づいて構築されています。アプリを一時停止しません。それは適切なアプローチではありません。接続を開始してから先に進む必要があります。接続が完了すると、そのイベントに基づいて行動します。

言い換えれば、loginメソッドは座って結果を待つことはできません。接続を開始して戻る必要があります。

接続の結果を取得したら、何らかのメソッドを呼び出してログイン結果を処理します。

ブロックを使用すると、このような作業が簡単になりますが、他の方法もあります。そのようなことを直線的に考えるのをやめればいいだけです。非同期処理を扱うには、別のアプローチが必要です。

于 2013-06-29T21:07:08.507 に答える