2013-04-30 89 views
3

我有一些ViewModel,我使用的服務是相當帶寬密集型的。但是,只有在查看應用程序中的特定視圖時才需要此服務。檢測ViewModel的關聯視圖是否顯示/不顯示

在MvvmCross vNext我用ViewUnRegistered/ViewRegistered事件時ViewModel被證明檢測,並有一個BaseViewModel這看起來是這樣的:

public class BaseViewModel 
    : MvxViewModel 
    , IMvxServiceConsumer 
{ 
    public BaseViewModel() 
    { 
     ViewUnRegistered += (s, e) => 
     { 
      if (!HasViews) 
      { 
       OnViewsDetached(); 
      } 
     }; 

     ViewRegistered += (s, e) => 
     { 
      if (HasViews) 
      { 
       OnViewsAttached(); 
      } 
     }; 
    } 

    public virtual void OnViewsAttached() 
    { 
     // nothing to do here 
    } 

    public virtual void OnViewsDetached() 
    { 
     // nothing to do in this base class 
    } 
} 

然後在我的其他ViewModel的I只想繼承這並覆蓋OnViewsAttachedOnViewsDetached以啓動和停止該服務。

現在在MvvmCross v3中,這兩個Event不再存在。據我瞭解,他們也不能在iOS上正常工作。 v3也有一個新的ViewModel生命週期,其中有SavedStateReloadState。雖然據我瞭解SavedState只有在ViewModel被調用被銷燬,即使它沒有顯示,情況可能並非如此。

至於檢測是否顯示相關的視圖,可以假設一個視圖顯示ShowViewModel被調用並且在視圖中有一些Init參數,但這裏棘手的部分是檢測視圖何時不顯示任何更多。任何想法如何實現這一目標?

回答

5

在所有平臺上確定視圖/視圖模型生命週期的這個區域是相當棘手的,特別是一旦開發商開始從「基本」演示模型偏離,並開始使用標籤,splitviews,彈出窗口,彈出按鈕等

MvvmCross V3目前還沒有一個通用的方法來處理這個問題。

時iOS6的去除viewDidUnload從vNext上面的代碼被打破(但通常使用不當呢! - 爲viewDidUnload沒有得到普遍調用時視圖模型開發者認爲這將是)

有一個問題打開仍在討論今後可能的共同想法... https://github.com/slodge/MvvmCross/issues/74


隨着中說,一些我最近使用這種類型的情況的模式是:

  • 對於大多數視圖模型,我什麼都不做 - 因爲這些視圖模型不會消耗任何資源,並且只能在系統需要內存回收時進行垃圾回收。

  • 對於消耗低強度資源的ViewModels(例如計時器滴答),我通常使用MvxMessenger將ViewModel連接到這些資源。此信使默認使用弱引用,當客戶訂閱/取消訂閱時,它本身發送subscription change messages

    使用此方法,我可以允許後臺資源監視視圖模型是否在內存中(並且由視圖引用) - 因此背景資源可以管理自己。

    ...雖然實際上很經常(例如,對於計時器滴答),但是我離開後臺資源不斷運行,無論ViewModel是否在監聽。

  • 對於那些需要資源監控的罕見情況 - 例如,對於需要維護一個活動的BlueTooth SPP通道的SpheroViewModel - 然後我在ViewModel上實現一個自定義接口 - 例如IActiveViewModel - 然後我勾到從搶答該接口上的每個不同的平臺

    一般來說,我做到這一點從ViewDidAppear的/消失的OnNavigatedTo /發件人,OnRestart /暫停 - 但確切時間是否爲你工作依賴於情況。

我懷疑,向前移動,這些資源密集型的ViewModels將是例外,而不是常態,但我希望我們會看到一些樣品/張貼的食譜其中展示的處理他們一些方法。

我們也很可能會看到一些人在嘗試其他持續資源情況 - 例如,應用程序需要執行後臺網絡操作或需要在單個視圖模型的生命週期之外監視地理位置(甚至可能超出應用程序)。以跨平臺的方式做這些事情是一個「有趣」的模式來考慮!