2013-04-26 4 views
0

Для моего приложения ios мне нужно обрабатывать те случаи, когда сервер возвращает ошибку, есть несколько ошибок, которые меня интересуют, таких как Not Found и Timed Out.Показать страницу обновления IOS-Xamarin

Я развиваюсь с помощью Xamarin и Windows Azure Mobile Services. Пока я знаю, как поймать эти исключения, однако в случае исключения я хотел бы показать представление, содержащее кнопку обновления, которую пользователь может нажать, чтобы обновить (перейдите на сервер и посмотрите, есть ли новые данные, удалить представление обновления и отобразить новую информацию).

это, как я захватывая исключения, сервер:

public async RefreshAsync(){   
     try 
     { 
      var results = await DailyWorkoutTable.ToListAsync(); 
      wod = results.FirstOrDefault(); 
      SetupUI(); 
     } 
     catch(Exception e) 
     { 
      var ex = e.GetBaseException() as MobileServiceInvalidOperationException; 
      if(ex.Response.StatusCode == 404) 
      { 
       //this is where I need to set up the refresh view and 
       //and add a UIButton to it 
       Console.WriteLine("Daily workout not found"); 
      } 
     } 
    } 

Я не знаю, что это правильный путь для достижения этой цели. Если я создаю UIView и добавлю к нему UIButton, с событием, которое снова вызывает RefreshAsync, оно не будет работать и не является самым изящным способом сделать это.

Есть ли другой подход на этом? пожалуйста помоги.

ответ

1

Вот пример, который вы можете использовать в качестве отправной точки:

/// <summary> 
/// A class for performing Tasks and prompting the user to retry on failure 
/// </summary> 
public class RetryDialog 
{ 
    /// <summary> 
    /// Performs a task, then prompts the user to retry if it fails 
    /// </summary> 
    public void Perform(Func<Task> func) 
    { 
     func().ContinueWith(t => 
     { 
      if (t.IsFaulted) 
      { 
       //TODO: you might want to log the error 

       ShowPopup().ContinueWith(task => 
       { 
        if (task.IsCompleted) 
         Perform(func); 

       }, TaskScheduler.FromCurrentSynchronizationContext()); 
      } 

     }, TaskScheduler.FromCurrentSynchronizationContext()); 
    } 

    /// <summary> 
    /// Wraps a retry/cancel popup in a Task 
    /// </summary> 
    private Task ShowPopup() 
    { 
     var taskCompletionSource = new TaskCompletionSource<bool>(); 

     var alertView = new UIAlertView("", "Something went wrong, retry?", null, "Ok", "Cancel"); 
     alertView.Dismissed += (sender, e) => { 
      if (e.ButtonIndex == 0) 
       taskCompletionSource.SetResult(true); 
      else 
       taskCompletionSource.SetCanceled(); 
     }; 
     alertView.Show(); 

     return taskCompletionSource.Task; 
    } 
} 

Чтобы использовать его:

var retryDialog = new RetryDialog(); 
retryDialog.Perform(() => DoSomethingThatReturnsTask()); 

Этот пример перед асинхронной/Await поддержки, но вы можете реорганизовать его, если желательно.

Вы также можете подумать о том, чтобы выполнить() вернуть задачу и стать асинхронным - в зависимости от вашего варианта использования.

Смежные вопросы