Các mẫu sử dụng Realm phù hợp / các phương pháp hay nhất?


76

Chúng tôi đang trong quá trình chuyển đổi một dự án để sử dụng Realm. Chúng tôi thực sự ấn tượng cho đến nay, đặc biệt là với Realm Browser (rất tiện dụng!).

Do đó, một số câu hỏi đã được đưa ra và chúng tôi muốn nhận ra một số mô hình sử dụng cụ thể trước khi tiếp tục. Ứng dụng của chúng tôi có rất nhiều luồng (lệnh gọi API, hoạt ảnh, v.v.), vì vậy hãy ghi nhớ điều đó khi đọc câu hỏi, vì tôi biết không thể truy cập các phiên bản Realm qua các luồng (hiện tại).

  • Chúng ta nên lo lắng đến mức nào về việc liên tục tạo các phiên bản của Realm? Chi phí là gì?
  • Chúng ta có nên giữ lại các phiên bản Realm trong ViewControllers hoặc Singletons để sử dụng nhiều lần không? Chúng tôi đã thử điều này nhưng đôi khi các phiên bản được truy cập từ các chuỗi khác nhau, vì vậy chúng tôi phải hoàn nguyên để tạo một phiên bản mới mỗi lần.
  • Khi truy cập thuộc tính mối quan hệ trên các cá thể Realm, dữ liệu kết quả được đọc có được giữ lại trong bộ nhớ hay nó được đọc từ đĩa mọi lúc? Chúng tôi có phải lo lắng về việc các phiên bản Realm được giữ lại trở nên quá lớn do quyền truy cập mối quan hệ sâu không?
  • Khi nào thì cần làm mới một phiên bản Realm? Tôi nhận thấy rằng khi tôi thực hiện các thay đổi trong trình duyệt Realm, chúng được phản ánh trong Realm được giữ lại mà không cần gọi làm mới.
    • Có vẻ như có một thuộc tính Tự động làm mới trên mỗi lĩnh vực gây ra điều này theo tài liệu.
  • Truy cập realmtài sản có phải là một Objecthành vi xấu? Chúng tôi đã sử dụng điều này để ghi vào Realm nếu hàm sử dụng đối tượng không tạo đối tượng hoặc Realm (tất nhiên là trên cùng một chuỗi).

Ví dụ...

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

Cảm ơn trước. Tôi mong chờ câu trả lời của bạn. : D

Câu trả lời:


85

(Tuyên bố từ chối trách nhiệm: Tôi làm việc cho Realm.Tôi đã rời Realm ngay bây giờ, nhưng tôi vẫn sẵn lòng trợ giúp!) :) Cảm ơn rất nhiều! Thật tuyệt khi biết bạn đang tận hưởng Realm!

Nhiều phiên bản Realm - Bạn không cần phải lo lắng về điều này! Đối tượng tệp Realm được tạo dựa trên khởi tạo lần đầu tiên trên mỗi luồng và đối tượng đó sau đó được trả về mỗi lần bạn thử và thể hiện nó mỗi lần sau đó.

Giữ lại các phiên bản Realm - Tiếp tục từ điểm đầu tiên, không, bạn không cần phải lo lắng về việc treo tham chiếu Realm bên trong các đối tượng khác. Vì Realm theo dõi các đối tượng tệp Realm trong nội bộ và trả về các đối tượng giống nhau, bạn sẽ không bị phạt nếu không làm như vậy. Điều đó đang được nói, nếu có một tham chiếu vĩnh viễn đến một đối tượng Realm bên trong đối tượng của bạn làm đơn giản hóa độ phức tạp mã của bạn, hãy tiếp tục sử dụng nó.

Truy cập thuộc tính mối quan hệ của Realm - Nói một cách chính xác, dữ liệu từ các tệp Realm không được sao chép từ đĩa (Giống như ORM bình thường sẽ làm); hơn nữa nó sử dụng ánh xạ bộ nhớ để tham chiếu trực tiếp dữ liệu từ đĩa thẳng đến các thuộc tính trong bộ nhớ của bạn. Vì vậy, không, bạn không cần phải lo lắng về việc tệp Realm có dung lượng quá lớn trong bộ nhớ.

Tự động làm mới Tự động làm mới chỉ được bật theo mặc định cho đối tượng tệp Realm trên chuỗi chính. Nó phải được kích hoạt thủ công cho các đối tượng tệp Realm trên các chuỗi khác hoặc thay vào đó bạn có thể chọn làm mới chúng theo cách thủ công bằng refreshlệnh gọi phương thức.

CHỈNH SỬA: Tôi đứng sửa! Tất cả các đối tượng tệp Realm trên nhiều luồng đều được autorefreshbật theo mặc định. Khi autorefreshđược bật, thời điểm duy nhất bạn cần gọi refreshlà nếu bạn cần các thay đổi được thực hiện đối với tệp Realm được phản ánh trong các tham chiếu khác trước khi hoàn thành lần lặp hiện tại của vòng lặp chạy.

Tham chiếu đến tham chiếu đến Vương quốc của một đối tượng Hoàn toàn không, nó không phải là một thực hành xấu chút nào! Tôi thực sự thích làm điều này trong các ứng dụng cá nhân của riêng mình sử dụng Realm để cung cấp ngữ cảnh thích hợp vì nó luôn dễ dàng hơn và cung cấp ngữ cảnh trực quan mạnh mẽ hơn giữa đối tượng và tệp Realm gốc của nó trong mã. (Haha yep, nếu có vấn đề về phân luồng ở đây, có lẽ bạn đã phát hiện ra nó trước khi đạt được vấn đềwrite).


Tôi hy vọng điều đó đã giúp! Hãy cho tôi biết nếu bạn cần làm rõ bất cứ điều gì ở đây!


Tuyệt diệu! Cảm ơn vì phản hồi cực nhanh. Chúng tôi chắc chắn sẽ đăng thêm bất kỳ câu hỏi nào khi chúng xuất hiện! Điểm về việc tự động làm mới chỉ được bật theo mặc định trên chuỗi chính có lẽ cũng nên được thêm vào tài liệu. :)
lionpants

4
Không có gì! Cảm ơn rất nhiều! Ahh, thực sự thì tôi đã sửa lại. Tôi vừa quay lại và kiểm tra mã để xác nhận điều đó và có vẻ như tính năng tự động làm mới được bật theo mặc định trên tất cả các chuỗi ngay bây giờ. Tôi đã cập nhật câu trả lời của mình để phản ánh điều đó.
TiM

Tôi đang thực sự căng thẳng bởi sự cố này trên memory exception và tôi dường như không thể để có được xung quanh nó và người dùng đang phàn nàn rất nhiều trong các ứng dụng sản xuất
Eenvincible

Đối với iOS? Bạn có thể vui lòng tạo vấn đề về nó với nhiều thông tin hơn trên repo Realm GitHub không? github.com/realm/realm-cocoa
TiM
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.