2015-07-23 18 views
56

Jesteśmy w trakcie przekształcania projektu, aby korzystać z dziedziny. Jesteśmy pod wrażeniem do tej pory, szczególnie z Realm Browser (bardzo przydatny!).Właściwe wzorce użytkowania/najlepsze praktyki?

W rezultacie pojawiło się kilka pytań i chcielibyśmy uzyskać pewne konkretne schematy użytkowania, zanim przejdziemy dalej. Nasza aplikacja jest mocno wielowątkowa (wywołania API, animacje itp.), Więc miej to na uwadze podczas czytania pytań, ponieważ wiem, że do instancji Realm nie można uzyskać dostępu przez wątki (obecnie).

  • Jak bardzo powinniśmy się martwić powtarzaniem tworzenia instancji w Królestwie? Jakie są koszty ogólne?
  • Czy powinniśmy zawracać sobie głowę instancjami Realm w ViewControllers lub Singletons do wielokrotnego użytku? Próbowaliśmy tego, ale czasami dostęp do instancji uzyskujemy z różnych wątków, więc musieliśmy powrócić do tworzenia nowej instancji za każdym razem.
  • Podczas uzyskiwania dostępu do właściwości relacji w instancjach Realm, czy dane wynikowe są odczytywane w pamięci lub czy są odczytywane z dysku za każdym razem? Czy musimy się martwić o zachowane instancje Realm stają się zbyt duże ze względu na dostęp do relacji głębokich?
  • Kiedy trzeba odświeżyć instancję dziedziny? Zauważyłem, że gdy wprowadzam zmiany w przeglądarce Realm, są one odzwierciedlane w zachowanej rzeczywistości bez konieczności odświeżania połączenia.
    • Wygląda na to, że w każdej dziedzinie występuje właściwość Auto-Refresh, która powoduje to zgodnie z dokumentacją.
  • Czy uzyskuje dostęp do właściwości realm na złym ćwiczeniu Object? Użyliśmy tego do napisania do Królestwa, jeśli funkcja używająca tego obiektu nie stworzyła obiektu lub Królestwa (oczywiście w tym samym wątku).

Na przykład ...

func saveStuff(thingToUpdate: Object?) { 
    if let thingToUpdate = thingToUpdate, let realm = thingToUpdate.realm { 
     realm.write { 
      thingToUpdate.name = "lionpants" 
     } 
    }  
} 

góry dzięki. Czekam na twoje odpowiedzi. : D

Odpowiedz

67

(Zastrzeżenie: pracuję w Realm.)) Wielkie dzięki! Wspaniale jest usłyszeć, że lubisz Realm!

wiele wystąpień realmie - Nie trzeba się martwić o to w ogóle! Obiekt pliku Realm jest tworzony przy pierwszym tworzeniu instancji dla każdego wątku, a ten sam obiekt jest następnie zwracany za każdym razem, gdy spróbujesz go zaimportować za każdym razem.

oporowe Przypadki realmie - opierając się na pierwszym miejscu, nie, nie trzeba się martwić, wiszące na odniesienie Realm wewnątrz innych obiektów. Ponieważ Realm śledzi wewnętrznie swoje obiekty plików Realm i zwraca te same, nie dostaniesz za to kary. W związku z tym, jeśli stałe odwołanie do obiektu Realm wewnątrz obiektu upraszcza złożoność kodu, możesz go nadal używać.

Dostęp Realm Właściwości związku - Ściśle mówiąc, dane z plików Realm nie są kopiowane z dysku (jak normalny ORM zrobi); więcej wykorzystuje odwzorowanie pamięci do bezpośredniego odniesienia danych z dysku bezpośrednio do twoich właściwości w pamięci. Nie, nie musisz się martwić, że pliki Królestwa stają się zbyt duże w pamięci.

Automatyczne odświeżanie Automatyczne odświeżanie jest włączone domyślnie tylko dla obiektu pliku Realm na głównym wątku. Musi być ręcznie włączone dla obiektów plików Realm na innych wątkach, lub możesz zamiast tego wybrać ręczne odświeżenie ich za pomocą wywołania metody refresh.

EDYCJA: Poprawiam się! Wszystkie obiekty plików Realm na wielu wątkach mają domyślnie wartość autorefresh. Gdy autorefresh jest włączony, jedyny przypadek, w którym należy wywołać refresh, jest konieczny, jeśli zmiany wprowadzone w pliku dziedziny muszą zostać odzwierciedlone w innych odniesieniach przed zakończeniem bieżącej iteracji pętli uruchamiania.

Odwoływanie odniesienie Realm obiektu, Absolutnie nie, to nie jest złą praktyką w ogóle! Właściwie wolę to robić w moich własnych aplikacjach, które używają Królestwa, aby zapewnić właściwy kontekst, ponieważ niezmiennie jest to łatwiejsze i zapewnia lepszy kontekst wizualny między obiektem a jego macierzystym plikiem Realm w kodzie. (Haha tak, gdyby był tu problem z gwintowaniem, prawdopodobnie odkryłbyś go zanim osiągnąłby punkt write).


Mam nadzieję, że pomogło! Daj mi znać, jeśli potrzebujesz wyjaśnienia czegokolwiek tutaj!

+0

Fantastyczne! Dzięki za super szybką odpowiedź. Z pewnością napiszemy jeszcze więcej pytań! Punkt dotyczący automatycznego odświeżania, który jest domyślnie włączony w głównym wątku, powinien prawdopodobnie zostać dodany do dokumentacji. :) – lionpants

+4

Wcale nie! Wielkie dzięki! Ahh, właściwie to się poprawiam. Właśnie wróciłem i sprawdziłem kod, aby to potwierdzić, i wygląda na to, że autorefresh jest teraz domyślnie włączony we wszystkich wątkach. Zaktualizowałem swoją odpowiedź, aby to odzwierciedlić. – TiM

+0

Naprawdę jestem zestresowany przez ten problem w wyjątku pamięci i nie mogę tego obejść, a użytkownicy często narzekają na aplikację produkcyjną – Eenvincible