Mã của bạn trông tuyệt vời và tiêu đề của bạn đi đúng hướng, vì vậy câu trả lời này là giải thích và gợi ý về mô hình hóa nhiều hơn so với mã cứng.
Đầu tiên, các đối tượng trong Realm là lười biếng đã tải có nghĩa là chúng chỉ được tải khi được sử dụng. Hàng chục nghìn đối tượng sẽ có rất ít tác động đến bộ nhớ thiết bị. Vì vậy, giả sử bạn có 10.000 người dùng và bạn 'tải tất cả họ vào'
let myTenThousandUsers = realm.objects(UserClass.self)
meh, không có gì to tát. Tuy nhiên, làm điều này
let someFilteredUsers = myTenThousandUsers.filter { $0.blah == "blah" }
sẽ (có thể) tạo ra sự cố - nếu điều đó trả về 10.000 người dùng tất cả họ đều được tải vào bộ nhớ có thể áp đảo thiết bị. Đó là một hàm Swift và thường nên tránh 'chuyển đổi' dữ liệu lười biếng của Realms bằng Swift (phụ thuộc vào trường hợp sử dụng)
Quan sát mã này bằng Swift .forEach
realm.objects(Project.self).forEach { (project) in
// Access fields
}
có thể gây ra sự cố tùy thuộc vào những gì đang được thực hiện với các đối tượng dự án đó - việc sử dụng chúng làm dữ liệu tableView dataSource có thể gây rắc rối nếu có nhiều đối tượng.
Điều thứ hai là câu hỏi về giới hạn 16Mb cho mỗi tài liệu. Để rõ ràng, đây là tài liệu Atlas
{
field1: value1,
field2: value2,
field3: value3,
...
fieldN: valueN
}
trong đó giá trị có thể là bất kỳ kiểu dữ liệu BSON nào, chẳng hạn như các tài liệu, mảng và mảng tài liệu khác.
Trong cấu trúc của bạn, var tasks = RealmSwift.List<Task>()
trong đó Tác vụ là một đối tượng được nhúng
. Trong khi các đối tượng được nhúng theo khái niệm là các đối tượng, tôi tin rằng chúng được tính vào một giới hạn tài liệu duy nhất vì chúng được nhúng (hãy sửa cho tôi nếu tôi sai); khi số lượng chúng tăng lên, kích thước của tài liệu kèm theo cũng tăng lên - hãy nhớ rằng 16Mb văn bản là MẠNH MẼ của văn bản nên sẽ / có thể tương đương với hàng triệu nhiệm vụ cho mỗi dự án.
Giải pháp đơn giản là không nhúng chúng và để chúng tự đứng.
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"
}
}
Sau đó, mỗi cái có thể là 16Mb và 'số lượng không giới hạn' có thể được liên kết với một dự án duy nhất. Một ưu điểm của các đối tượng nhúng là kiểu xóa theo tầng trong đó khi đối tượng mẹ bị xóa thì các đối tượng con cũng vậy, nhưng với mối quan hệ 1-nhiều từ Dự án đến Nhiệm vụ - việc xóa một loạt các nhiệm vụ thuộc về đối tượng mẹ rất dễ dàng.
Ồ - một trường hợp khác đối với việc không sử dụng các đối tượng nhúng - đặc biệt là đối với trường hợp sử dụng này - là chúng không thể có các thuộc tính được lập chỉ mục. Lập chỉ mục có thể tăng tốc đáng kể một số truy vấn.