2012-02-11 28 views
10

Tôi có một lớp con của một NSManagedObject, và tôi muốn thêm một vài ngà voi để theo dõi một số sách. Tôi không muốn những vars này tồn tại, và đó là lý do tại sao tôi không bao gồm chúng như là một phần của mô hình dữ liệu.thêm các biến không liên tục vào nsmangedobject

Tôi đang gặp khó khăn trong việc tìm cách thích hợp để thực hiện việc này.

  • Tôi có nên tạo các loại ivars trong lớp, tạo thuộc tính tương ứng và sau đó tổng hợp chúng trong quá trình triển khai không?
  • tôi không nên tạo ivars, và thay vào đó chỉ cần khai báo tài sản và sau đó @dynamic tài sản trong implmentation?
  • có cách tiếp cận nào khác mà tôi nên dùng không?

Và tôi có nên thực hiện tất cả tùy chỉnh trong lớp con NSManagedObject của mình không, hoặc tôi nên tạo một lớp con của lớp con của mình để nếu tôi thay đổi mô hình dữ liệu của mình xcode để tạo phân lớp NSManagedObject của tôi tự động?

Cảm ơn!

Trả lời

9

Mỗi thuộc tính cho NSManagedObject có hộp kiểm có tên thoáng qua. Bằng cách này, bạn sẽ có các trình truy cập động cho đối tượng mà không thực sự bền bỉ chính giá trị thuộc tính. Tìm hộp kiểm ngay bên dưới trường văn bản để nhập tên thuộc tính.

enter image description here

CẬP NHẬT Nếu bạn không muốn tạo ra một sự chuyển đổi vì các thuộc tính mới, hãy ivars chuẩn

@interface MyMO : NSManagedObject { 
    NSString *_nonPersistentAttribute; 
} 

@property (nonatomic, retain) NSString *nonPersistentAttribute; 

@end 

@implementation MyMO 

@synthesize nonPersistentAttribute=_nonPersistentAttribute; 

@end 
+0

thực hiện sửa đổi đối với thuộc tính tạm thời sẽ đánh dấu NSManagedObject là bẩn. Có cách nào ưa thích để thêm các vars bổ sung mà không khiến đối tượng nghĩ rằng nó cần phải được lưu lại không? Và tôi không cần hoàn tác hỗ trợ. Cảm ơn –

+0

Sau đó, chỉ cần thêm iVars theo cách thông thường và '@ synthesize' các accessors. – Eimantas

+0

Cảm ơn bạn đã đề xuất hai lựa chọn thay thế. Tôi đã sử dụng thành công lần thứ hai một lần, nhưng bây giờ tôi chỉ nhận được "bộ chọn không nhận dạng được gửi đến ví dụ" ngoại lệ bất cứ khi nào tôi cố truy cập thuộc tính tạm thời. Bất kỳ ý tưởng? –

1

Dưới đây là một mẫu thuận tiện Tôi đã sử dụng trong quá khứ:

Tạo danh mục lớp học của bạn và đưa vào một tệp nguồn bổ sung, chẳng hạn như ManagedObject+Support.h. Hãy nhớ rằng, trong khai báo giao diện, bạn chỉ sử dụng các dấu ngoặc vuông như sau:

@interface ManagedObject (Support) 
// declare your variables and methods 
@end 

Bằng cách này, bạn có thể thay đổi mọi thứ mà không phải sửa đổi mô hình đối tượng được quản lý của mình. (Thay đổi MOM có nhiều vấn đề với cơ sở dữ liệu được tái tạo, di chuyển, vv). Khi bạn thay đổi mô hình, bạn có thể tạo lại các tệp lớp mà không mất mã trong danh mục.

2

Wise,

Để đầu tiên câu hỏi lại bạn: ivars, bạn có hai lựa chọn ivars tiêu chuẩn hoặc các thuộc tính thoáng qua về tổ chức của bạn. Sự khác biệt lớn giữa hai là các thuộc tính tạm thời tham gia vào các thay đổi/bẩn/hoàn tác các khía cạnh của Dữ liệu cốt lõi. Nếu ivars của bạn không cần nó, thì đừng sử dụng các thuộc tính tạm thời. (Có, hãy sử dụng @property@synthesize cho ivars của bạn.)

Để hỏi lại câu hỏi thứ hai của bạn: nơi thực hiện thay đổi? Tôi hơi buồn cười. Các mẫu tiêu đề được tạo tự động bởi Xcode khá đơn giản. Do đó, tôi sử dụng các tệp được tạo tự động cho lần đầu tiên tôi tạo một thực thể và chỉnh sửa trong các thay đổi của mình sau đó. Thành thật mà nói, bạn không thay đổi cấu trúc dữ liệu mô hình của bạn thường xuyên. Do đó, thêm một vài dòng ở đây và ở đó cho cả hai .h & .m tệp không phải là một chi phí lớn. Có những cơ chế khác. Hệ thống mogenerator của Wolf Rentzch được tôn trọng và hữu ích.Điều đó nói rằng, tôi không tin rằng mogenerator giải quyết một vấn đề phải đối mặt bởi các lập trình viên Core Object-C v2 hiện đại. (Obj-C v2 đã làm nhiều điều dễ dàng hơn cho các lập trình Core Data.)

Andrew

10

Các tài liệu cho NSManagedObject có một phần gọi là Tuỳ chỉnh Instance Biến. Nó thảo luận cả hai cách tiếp cận.

Cả hai thuộc tính tạm thời, thuộc tính được mô hình hoá và ivars là giải pháp tốt. Nó phụ thuộc vào hương vị và phong cách.

Một rất quan trọng điểm cần ghi nhớ nếu bạn sử dụng ivars: Bạn cần phải rõ ràng ra ivars trong - (void)didTurnIntoFault và đặt bất kỳ giá trị ban đầu trong - (void)awakeFromFetch- (void)awakeFromInsert. Bạn cần phải không phải chạm vào bất kỳ thuộc tính hoặc mối quan hệ được mô hình hóa nào bên trong -didTurnIntoFault nếu không bạn sẽ gặp sự cố.

Các vấn đề liên quan