2017-02-21 27 views
5

Kiedy wyświetlam stronę, muszę co minutę wysyłać żądania aktualizacji danych w przedstawionej tabeli. Nie wiem, gdzie dodać tę logikę timera, ponieważ wszystkie metody cyklu życia kontrolera powinny kończyć się w odpowiednim czasie - jak sądzę?Gdzie dodać zegar w Xamarin.iOS?

Gdzie powinienem umieścić zegar?

+0

Chyba trzeba zadzwonić i harmonogram czasowy od 'viewWillAppear:' metoda & unieważnić i ustawić go do zera w 'viewWillDisAppear:' metody. –

+0

Możesz uruchomić timer w viewWillAppear, ale jeśli chcesz, aby ta aktualizacja wystąpiła, gdy aplikacja nie jest aktywna, musisz użyć funkcji pobierania w tle i możesz powiedzieć systemowi iOS, jak często chcesz aktualizować, ale system iOS dyktuje, kiedy pozwoli Ci to na aktualizacja. –

Odpowiedz

3

Ponieważ mówisz, że musisz wysyłać żądanie co minutę po wyświetleniu strony, dobrym rozwiązaniem jest uruchomienie licznika czasu w metodzie ViewWillAppear() i zatrzymanie go w ViewWillDisappear() - będzie działać tylko wtedy, gdy ViewController jest widoczny na pierwszym planie . Rozłączenie OnTimedEvent jest ważne, aby uniknąć wycieku pamięci.

Czy tego właśnie potrzebujesz, czy masz jakieś bardziej szczegółowe wymagania?

Przykładowy kod:

class MyViewController : UIViewController 
{ 
    public MyViewController(IntPtr handle) 
     : base(handle) 
    { 
    } 

    private Timer timer; 
    private bool timerEventBinded; 

    public override void ViewWillAppear(bool animated) 
    { 
     base.ViewWillAppear(animated); 
     if (timer == null) 
     { 
      timer = new Timer(); 
      timer.Enabled = true; 
      timer.Interval = 60000; 
     } 

     if (!timerEventBinded) 
     { 
      timer.Elapsed += OnTimedEvent; 
      timerEventBinded = true; 
     } 

     timer.Start(); 
    } 

    public override void ViewWillDisappear(bool animated) 
    { 
     if (timer != null) 
     { 
      timer.Stop(); 
      if (timerEventBinded) 
      { 
       timer.Elapsed -= OnTimedEvent; 
       timerEventBinded = false; 
      } 
      timer = null; 
     } 

     base.ViewWillDisappear(animated); 
    } 

    private void OnTimedEvent(Object src, ElapsedEventArgs e) 
    { 
     //do your stuff 
    } 
} 
+0

Proponuję dodać uzasadnienie, dlaczego ten kod jest tym, czego szuka OP. Pozostawienie fragmentu kodu i powiedzenie "to działa dla mnie" nie jest dobrą odpowiedzią. – Cheesebaron

+0

@Cheesebaron Pewnie, właśnie dodałem. –

+1

@DavidRiha to nie działa, gdy aplikacja działa w tle i jestem pewien, że użytkownik nie powinien przechowywać aplikacji przez wiele godzin. –