2011-08-10 3 views
0

IPadアプリケーションから呼び出すSOAPサービスが2つあります。SOAPサービスを呼び出すときObjective-Cのコールバックが正しくありません

一つは(SecurityASMX)でユーザをログインするために使用され、他のは、現在のユーザー名(SecuredCalls)一度ログインを返すものです。

は、私は、次のコードを使用しても問題SecurityASMXを呼び出すことはできません。これは正常に動作します

- (IBAction) OnButtonClick:(id) sender { 

    bindingSecurity = [[SecurityASMXSvc SecurityASMXSoapBinding] initWithAddress:@"http://myserver/Azur.IPADTest.Web.Services/public/Security.asmx"]; 
    bindingSecurity.logXMLInOut = YES; 

    SecurityASMXSvc_Login *requestLogin = [[SecurityASMXSvc_Login alloc] init]; 
    requestLogin.strUsername = @"test"; 
    requestLogin.strPassword = @"testpass"; 

    [bindingSecurity LoginAsyncUsingParameters:requestLogin delegate:self]; 

    [requestLogin release]; 

    self.label.text = @"Login in progress"; 
} 

- (void) operation:(SecurityASMXSoapBindingOperation *)operation completedWithResponse:(SecurityASMXSoapBindingResponse *)response 
{ 
    [NSThread sleepForTimeInterval:2.0]; 

    self.label.text = @"Login Done!"; 

} 

:非同期呼び出しのコールバックは操作です。

しかし、同じコードファイルで、私は次のコードでユーザー名を返すように2番目のWebサービスにバインドしています。非同期呼び出しのコールバックはoperationSecureです:

- (IBAction) OnButtonSecureCallClick:(id) sender { 

    bindingSecuredCalls = [[SecureCallsSvc SecureCallsSoapBinding] initWithAddress:@"http://myserver/Azur.IPADTest.Web.Services/private/SecureCalls.asmx"]; 
    bindingSecuredCalls.logXMLInOut = YES; 

    SecureCallsSvc_ReturnUserName *requestReturnUserName = [[SecureCallsSvc_ReturnUserName alloc] init]; 

    [bindingSecuredCalls ReturnUserNameAsyncUsingParameters:requestReturnUserName delegate:self]; 

    [requestReturnUserName release]; 

    self.label.text = @"Get UserName In Progress"; 
} 


- (void) operationSecure:(SecureCallsSoapBindingOperation *)operation completedWithResponse:(SecureCallsSoapBindingResponse *)response 
{ 
    [NSThread sleepForTimeInterval:2.0]; 

    self.label.text = @"Get Username Done!"; 

} 

問題呼び出しがリターンをReturnUserNameする際に、呼び出されるメソッドは、ログイン(操作)用とない私が欲しい1(であるということですオペレーション)。

第2コールバックを呼び出すために2番目のWebサービスバインディングをどのように伝えることができますか?

ありがとうございます!

答えて

0

まず、使用しているAPI(サードパーティ製のAPIであると仮定します)がコールバックメソッドを指定できるかどうかを確認することです。

もしそうでなければ、操作パラメータを操作してisKindOfClassを使って、実際に何が渡されているのかを知ることができます。

- (void) operation:(SecurityASMXSoapBindingOperation *)operation completedWithResponse:(SecurityASMXSoapBindingResponse *)response 
{ 
    [NSThread sleepForTimeInterval:2.0]; 

    if([operation isKindOfClass:[SecurityASMXSoapBindingOperation class]]) 
    { 
     self.label.text = @"Login Done!"; 
    } 
    else if([operation isKindOfClass:[SecureCallsSoapBindingOperation class]]) 
    { 
     self.label.text = @"Get Username Done!"; 
    } 
} 

理想的には、返されるそれぞれのオブジェクトのスーパークラスに操作パラメータと応答パラメータのタイプを設定します。

+0

はい、私は要求に代理人を渡すことができるようですが、どちらの場合も_self_を渡します。コンパイラは私にそれをさせません。 – alexbf

+0

これは代理パラメータであり、コールバックメソッドパラメータではありません。 APIがあなたにそれを変更することを許すならば、おそらくセレクターを取るメソッドがあり、おそらくsetCompletedWithResponseSelectorまたはそれに類似した名前です。そうでなければ、私が与えた答えに従わなければならないでしょう。 – InsertWittyName

+0

セレクタ(コールバックメソッド?)を変更することはできません。私はsoap呼び出しにwsdl2objcを使用します。コールバックを呼び出す行は、 '[デリゲート操作:self completedWithResponse:レスポンス];'です。別のセレクタを持つように見えますか? – alexbf

関連する問題