2017-04-15 97 views
1

我在Xamarin.Forms中使用Realm來構建移動應用程序,並且對關閉xamarin領域有一些疑問。在xamarin中處置領域

以下是更新的境界

public void updateData(EventType e) 
     { 

       Realm realm = Realm.GetInstance(); 
       realm.WriteAsync(tempRealm => 
       { 

        tempRealm.Add(e.response, true); 
       }); 

       realm.Dispose(); 

       MessagingCenter.Send<IMessage, EventType>(this, RestApi.UI_EVENT, e); 


     } 
  1. 我們需要調用realm.Dispose(),每次當我們調用Realm.GetInstance();記錄的方法是什麼?
  2. WriteAsync是否負責關閉/處理領域?
  3. 我是否需要使用await再次使用realm.WriteAsync作爲其異步方法。

回答

1

每當我們調用Realm.GetInstance時,我們是否需要每次調用realm.Dispose()?

是的。最後你應該Dispose在你不再使用它們的Realm實例上。這將釋放所有消耗的資源(本地和受管)。

通常我在應用程序的生命週期中(在每個平臺的應用程序生命週期之後)保持UI線程實例處於打開狀態。即我將這個Realm實例看作HttpClient實例,這是一個可以從中打開其他實例的應用程序級單例。現在我做開放和後臺線程情況下處置時,我通過更新服務,廣播接收器,推送更新,等等

注意數據庫:請記住,如果你是一個背景線程,並獲得多個領域在該線程上的相同RealmConfigurationBase的實例,它們實際上將全部是相同的Realm實例(Realm.IsSameInstance)。您可以在每個調用Dispose而不是實際上關閉Realm.IsClosed)實例,直到該線程上的所有實例都被處置。

WriteAsync是否負責關閉/處理領域?

是的。您不想在傳遞到您的lamba函數的Realm實例上調用Dispose

事實上,如果你這樣做,你將收到System.ObjectDisposedException,因爲Realm已經用事務塊包裝了該lamba,並且在事務已被提交或回滾之前已經處理了領域實例。

我必須使用await對realm.WriteAsync作爲其異步方法。

參考許多其他SO關於消防&忘記異步方法調用,即:Why do I have to use await for a method to run asynchronously. What if I don't want to wait for the method to finish before continuing?