2013-04-11 11 views
6

Tôi đang có một số suy nghĩ về cách sử dụng một số lớp con NSManagedObject của dữ liệu cốt lõi để xử lý dữ liệu liên tục và dữ liệu không liên tục.Sử dụng lớp con NSManagedObject để truyền dữ liệu liên tục và không liên tục

Giả sử bạn có ứng dụng công thức hiển thị danh sách công thức nấu ăn của riêng bạn từ CoreData và trong cùng ứng dụng này, bạn cũng có thể tìm kiếm công thức nấu ăn của người dùng khác. Những công thức nấu ăn của người dùng khác tất nhiên là từ một API và chúng tôi không muốn lưu chúng vào dữ liệu cốt lõi. Nhưng những gì chúng tôi muốn thay vào đó là chi tiết công thức của chúng tôi Xem điều khiển để hành động giống nhau hoặc nó được đưa ra một công thức liên tục hoặc một công thức không liên tục. Tôi tự nhiên nghĩ rằng chúng ta nên sử dụng cùng một wrapper đối tượng xung quanh dữ liệu của chúng tôi và để cho View Controller của chúng ta bị mù trên nguồn gốc của dữ liệu.

Vấn đề là lớp con NSManagedObject không thể được khởi tạo thủ công và phải được chèn vào ngữ cảnh. Điều đó không tốt cho công thức nấu ăn của người dùng khác của chúng tôi. Mặt khác cho công thức nấu ăn của riêng chúng ta, chúng ta cần những vật thể này được chèn vào trong ngữ cảnh.

Tôi có một vài giải pháp trong đầu nhưng tôi thực sự muốn đọc những gì các bạn nghĩ về vấn đề này.

Bạn có thể nói rằng đây là một số vấn đề triển khai và cần được giải quyết bằng cách gói cả hai đối tượng dữ liệu vào một đối tượng duy nhất? Ví dụ bằng cách ghi đè tất cả các getters và setters để xử lý cả hai đối tượng coredata và các đối tượng NSDictionary?

Hoặc nó là một vấn đề kiến ​​trúc, và bạn sẽ giải quyết nó bằng cách ví dụ lồng NSManagedContext, hoặc sử dụng nhiều cửa hàng liên tục (một trong bộ nhớ và một Sqlite khác)?

Trả lời

7

Thực ra bạn có thể tạo các cá thể NSManagedObject mà không chèn chúng vào ngữ cảnh. Chỉ cần vượt qua nil làm đối số bối cảnh đối tượng được quản lý. Làm điều gì đó như:

NSEntityDescription *myRecipeEntity = [NSEntityDescription entityForName:@"MyRecipeEntity" inManagedObjectContext:[self managedObjectContext]]; 
MyRecipeClass *recipe = [[MyRecipeClass alloc] initWithEntity:myRecipeEntity insertIntoManagedObjectContext:nil]]; 

Bây giờ bạn có một trường hợp công thức không có trong bất kỳ ngữ cảnh nào.

Nếu sau này bạn muốn thêm nó vào một bối cảnh:

[[self managedObjectContext] insertObject:recipe]; 

Nếu bạn không muốn để chèn nó, chỉ cần vứt nó đi.

+0

Điều đó rất thú vị! Cảm ơn bạn đã chỉ ra điều đó. –

+0

Bạn không thể có mối quan hệ giữa các đối tượng không được chèn vào ngữ cảnh theo như tôi biết. – svena

+0

Chắc chắn. Nhưng điều đó không phải lúc nào cũng quan trọng. –

1

Tôi có thể chỉ sử dụng ngữ cảnh riêng biệt mà bạn không bao giờ lưu, đó có vẻ là tuyến đường đơn giản nhất.

0

Cấu hình mô hình - cửa hàng trong bộ nhớ và cửa hàng được lưu trữ sqlite.

Tôi sẽ xem xét nghiêm túc việc sử dụng các cấu hình mô hình và hai loại lưu trữ liên tục: trong bộ nhớ và sqlite được sao lưu. Nhưng nó cũng có nghĩa là bạn sẽ phải tạo các thực thể riêng biệt cho dữ liệu có thể tải xuống mà loại bỏ ý tưởng rằng bạn có thể có một số công thức nấu ăn liên tục và một số tạm thời trong khi cả hai công thức nấu ăn. Ngoài ra, bạn không thể có mối quan hệ giữa các thực thể trong các cửa hàng liên tục khác nhau. Bạn sẽ từ bỏ lợi ích của các mối quan hệ nghịch đảo và phải bắt chước điều này với các thuộc tính được tìm nạp chẳng hạn.

Tất cả trong tất cả, đó là lựa chọn khả thi với một số nhược điểm.

Isolated Managed Object Context

Ưu điểm lớn nhất của việc sử dụng bối cảnh đối tượng được quản lý riêng biệt là bạn có thể sử dụng các thực thể công thức tương tự cho cả dữ liệu liên tục và tạm thời. Bạn sẽ phải tránh lưu bối cảnh tạm thời và sẽ phải mang tất cả các thay đổi từ cửa hàng liên tục hoặc hợp nhất từ ​​ngữ cảnh khác có dữ liệu bạn lưu. Thách thức với giải pháp thay thế này là bạn phải xây dựng hầu hết giao diện người dùng của mình ở đầu ngữ cảnh bị cô lập này để đọc, nhưng tất cả thay đổi vĩnh viễn bạn cần phải được lưu vào ngữ cảnh chính và được truyền lại thông qua hợp nhất bối cảnh. Điều này có thể giới thiệu một số tình huống khó khăn, nhưng đó là doable tôi nghĩ.