Twój kod wygląda świetnie i zmierzasz we właściwym kierunku, więc ta odpowiedź zawiera więcej wyjaśnień i sugestii dotyczących modelowania niż twardy kod.
Po pierwsze, obiekty Realm są leniwie załadowany co oznacza, że są ładowane tylko wtedy, gdy są używane. Dziesiątki tysięcy obiektów będą miały bardzo mały wpływ na pamięć urządzenia. Załóżmy więc, że masz 10 000 użytkowników i „załadujesz ich wszystkich”
let myTenThousandUsers = realm.objects(UserClass.self)
meh, nic wielkiego. Jednak robi to
let someFilteredUsers = myTenThousandUsers.filter { $0.blah == "blah" }
spowoduje (może) stworzyć problem - jeśli zwróci 10 000 użytkowników wszyscy są załadowani do pamięci prawdopodobnie przytłacza urządzenie. Jest to funkcja Swift i generalnie należy unikać „konwertowania” leniwych danych Realms za pomocą Swift (zależnie od przypadku użycia)
Obserwacja tego kodu za pomocą Swift .forEach
realm.objects(Project.self).forEach { (project) in
// Access fields
}
może powodować problemy w zależności od tego, co jest robione z tymi obiektami projektu - używanie ich jako źródła danych TableView może być kłopotliwe, jeśli jest ich dużo.
Druga sprawa to pytanie o limit 16 MB na dokument. Dla jasności dokument Atlas jest tym
{
field1: value1,
field2: value2,
field3: value3,
...
fieldN: valueN
}
gdzie wartość może być dowolnym typem danych BSON, takim jak inne dokumenty, tablice i tablice dokumentów.
W Twojej strukturze var tasks = RealmSwift.List<Task>()
gdzie Zadanie to obiekt osadzony
. Chociaż obiekty osadzone koncepcyjnie są obiektami, uważam, że liczą się do limitu pojedynczego dokumentu, ponieważ są osadzone (popraw mnie, jeśli się mylę); wraz ze wzrostem ich liczby rośnie rozmiar dokumentu załączonego - pamiętając, że 16 MB tekstu to OGROMNY tekst, co oznaczałoby/może równać się milionom zadań na projekt.
Prostym rozwiązaniem jest nie osadzenie ich i pozostawienie ich samodzielnie.
class Task: Object {
@objc dynamic var _id: String = ObjectId.generate().stringValue
@objc dynamic var _partition: String = ""
@objc dynamic var name: String = ""
@objc dynamic var status: String = "Pending"
override static func primaryKey() -> String? {
return "_id"
}
}
Wtedy każdy z nich może mieć 16 MB, a „nieograniczona ilość” może być powiązana z jednym projektem. Jedną z zalet osadzonych obiektów jest rodzaj usuwania kaskadowego, w którym gdy obiekt nadrzędny jest usuwany, obiekty podrzędne również są usuwane, ale z relacją 1 do wielu z projektu do zadań — usuwanie wielu zadań należących do rodzica jest łatwe.
Och - kolejny przypadek nieużywania obiektów osadzonych - szczególnie w tym przypadku użycia - jest to, że nie mogą mieć indeksowanych właściwości. Indeksowanie może znacznie przyspieszyć niektóre zapytania.