2012-03-12 30 views
8

Việc kê khai tiêu chuẩn cho một NSManagedObject tài sản autogenerated tuyên bố to-nhiều mối quan hệ như thế này:Bộ có thể thay đổi trong NSManagedObjects?

@property (nonatomic, retain) NSSet *somethings; 
... 
@dynamic somethings; 

Nó sẽ được an toàn để thay đổi điều đó tuyên bố một NSMutableSet? Thành phần CoreData vẫn hoạt động chính xác?

Đánh giá bởi @dynamic, nó probaby không quan tâm nếu tôi sử dụng lớp con NSSet thay vì NSSet, nhưng tôi không muốn viết lại nhiều mã chỉ để tìm ra nó không hoạt động.

Trả lời

11

Theo Apple Core Data Programming Guide, điều này luôn luôn phải được khai báo là một NSSet.

Nếu bạn muốn một proxy có thể thay đổi (mà về cơ bản là phiên bản có thể thay đổi các thiết lập dữ liệu cốt lõi và làm việc giống hệt nhau) sau đó bạn sẽ sử dụng chức năng mutableSetValueForKey như thế này:

// myManagedObject is the managed object that has the somethings property. 
NSMutableSet *mutableSomethings = [myManagedObject mutableSetValueForKey:@"somethings"]; 

mutableSomethings sau đó có thể được sửa đổi như một NSMutableSet chuẩn và somethings sẽ được cập nhật và các phương thức KVO sẽ được gọi một cách thích hợp. Tuy nhiên, cần lưu ý rằng nhiều tính năng của bộ có thể thay đổi (như addSomethingsObjectremoveSomethingsObject) đã được cung cấp trong các trình truy cập được tạo dữ liệu lõi nên trong nhiều trường hợp, bạn không cần sử dụng proxy.

6

Bạn nên giữ nó như một NSSet và thực hiện một trong các cách sau:

  1. Sử dụng key value coding
  2. Thêm lõi data generated accessors

Đối với mã hóa giá trị quan trọng, bạn sẽ truy cập vào bộ sưu tập của bạn như vậy:

NSMutableSet *somethings = [object mutableSetValueForKey:@"somethings"]; 
[somethings addObject:newObject]; 

Vì dữ liệu cốt lõi tạo accessors, bạn muốn thêm dòng sau vào tiêu đề của bạn:

@interface MyManagedObject (CoreDataGenerated) 
- (void)addSomethingsObject:(MySomething *)object; 
- (void)removeSomethingsObject:(MySomething *)object; 
- (void)addSomethings:(NSSet *)somethings; 
- (void)removeSomethings:(NSSet *)somethings; 
@end 

Bạn không cần phải thực hiện các phương pháp này (Core Dữ liệu sẽ chăm sóc nó cho bạn), và bạn có thể gọi cho họ một cách dễ dàng. Đây là cách ưa thích của tôi trong việc xử lý các bộ sưu tập vì bạn có thể kiểm tra kiểu tốt hơn từ trình biên dịch.

Lý do bạn không nên thay đổi nó thành NSMutableSet là do có nhiều khả năng bạn sẽ gây ra sự cố và/hoặc thay đổi của bạn sẽ không được lưu vào kho dữ liệu cốt lõi của bạn.

Bạn cũng có thể muốn xem xét mogenerator để giúp bạn tạo ra tất cả các lớp học Cocoa của bạn.

+0

nó sẽ gây ra bất kỳ vấn đề gì nếu tôi thêm đối tượng đã có vào mối quan hệ – Johnykutty

+2

@Johnykutty bộ đảm bảo rằng không có bản sao. Điều này sẽ không có hiệu lực. – wbyoung

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