2012-10-29 254 views
2

我需要在MonoTouch中異步進行web服務調用,因爲UIAlertView只在工作完成後才顯示出來。異步方法?

當前碼(僞)

Class LoginviewController 
{ 
     void Login(credentials) 
     { 
      showAlert("Logging in") ; 
      bool authenticated = service.Authenticate(Credentials); 
     } 
}  

class Service 
{ 
     Public bool Authenticate(object Credentials) 
     { 
      object[] results = this.Invoke("GetAuth", Credentials) 
     } 
} 

我在移動服務的方法來異步模式,配合量由BeginAuthenticate(), EndAuthenticate(), AuthenticateAsync(), OnAuthenticateOperationCompleted()當然Authenticate()的身份驗證的過程。

當所有這些都完成了,我需要在其上運行LoginViewController OnAuthenticateCompleted(),所以我會用BeginInvokeOnMainThread(delegate....

這是我卡住。

如何從服務類中執行LoginViewController類實例中的方法OnAuthenticateCompleted()

編輯:解決方法:

補充說,在登錄()掛鉤,並稱爲AuthenticateAsync()方法,而不是身份驗證的OnAuthenticateCompleted事件處理程序()。

Class LoginviewController 
    { 
      void Login(credentials) 
      { 
       showAlert("Logging in") ; 
       service.AuthenticateCompleted += new GetAuthenticationCompletedEventHandler(OnAuthenticateCompleted); 
       service.AuthenticateAsync(Credentials); 
      } 

      public void OnAuthenticateCompleted(obj sender, GetAuthenticationCompletedEventArgs args) 
      { 
       bool authenticated = (bool)args.Results; 
       //do stuff 
       hideAlert(); 
      } 
    }  

回答

2

您不從服務類執行LoginViewController.OnAuthenticateCompleted,您在完成的事件處理程序中執行它。

class LoginViewController 
{ 
    void Login (credentials) 
    { 
     service.AuthenticateAsync (credentials, LoginCompletedCallback); 
     } 

    } 
    void LoginCompletedCallback() 
    { 
     BeginInvokeOnMainThread (OnAuthenticateCompleteded); 
    } 
}