2011-08-10 48 views
0

我有2個SOAP服務需要從IPad應用調用。調用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!"; 

} 

這工作得很好。

但是,在相同的代碼文件中,我有一個綁定到我的第二個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回報,被調用的方法是一個用於登錄(操作),而不是一個我想要的( operationSecure)。

如何告訴我的第二個webservice綁定調用第二個回調?

謝謝!

回答

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_。我無法傳遞_self.operationSecure_編譯器不會讓我這樣做。 – alexbf

+0

這是委託參數,而不是回調方法參數。如果API允許你改變它,那麼可能會有一個方法需要一個選擇器,並可能被命名爲setCompletedWithResponseSelector或類似的。如果不是,你必須遵循我給出的答案。 – InsertWittyName

+0

它看起來不像我可以改變選擇器(回調方法?)。我用我的肥皂調用wsdl2objc。它調用回調的行是:'[delegate operation:self completedWithResponse:response];'。它看起來像它可以有一個不同的選擇器? – alexbf