2011-10-11 26 views
8

Có thể nhận được gọi lại hoặc thông báo trong thực thể mẹ khi bất kỳ mối quan hệ nào của đối tượng thay đổi không? Điều này làm việc tuyệt vời khi một thuộc tính của thực thể thay đổi. Các phương pháp sau đây ...Thông báo cho thực thể cha mẹ khi con Quan hệ thực thể thay đổi trong dữ liệu cốt lõi

- (void)didChangeValueForKey:(NSString *)key

được gọi vào lớp Entity tôi. Tuy nhiên, phương thức này không được gọi khi một thuộc tính trong một trong các mối quan hệ thay đổi.

Điều tôi đang cố làm là cập nhật thuộc tính timeStamp trên thực thể cha mẹ của tôi khi bất kỳ thuộc tính hoặc đối tượng mối quan hệ nào thay đổi.

Trả lời

5

Thực thể mẹ có thể tự thiết lập làm người quan sát mối quan hệ và nó sẽ được thông báo khi mối quan hệ đó thay đổi. Tuy nhiên điều đó sẽ chỉ được kích hoạt khi mối quan hệ thực tế (thêm hoặc loại bỏ một đứa trẻ) xảy ra.

Để xem một thực thể con cụ thể phức tạp hơn nhiều. Có một số cách để giải quyết vấn đề này:

  1. Cho trẻ ping cha mẹ khi các thuộc tính của nó thay đổi.
  2. Yêu cầu phụ huynh nghe NSManagedObjectContextDidSaveNotification và xem liệu có con nào trong số đó lưu
  3. Phụ huynh có quan sát các giá trị trên trẻ em hay không.

Có thể có các giải pháp khác nhưng trong số ba giải pháp tôi khuyên bạn nên # 2. Nó là khá dễ dàng để thiết lập và tác động hiệu suất là khá tối thiểu.

+0

Tôi yêu rằng tôi có thể gửi câu hỏi ra ngoài khoảng trống và nhận phản hồi! Tôi quyết định giải pháp # 2. Tôi đang lặp qua các mối quan hệ cha mẹ và kiểm tra xem có bất kỳ mối quan hệ nào managedObjects giống với thông báo managedObject không. –

+0

Hãy nhớ rằng bạn có thể chạy một biến vị ngữ đối với những trường hợp 'NSSet' quay trở lại. Không cần lặp vòng :) Vị từ có thể giống như '@" entity.name ==% @ && parent ==% @ "' sẽ cung cấp cho bạn bất kỳ con nào của thực thể hiện tại có mối quan hệ mà bạn quan tâm. –

+0

Tuyệt vời, cảm ơn! Làm việc như một say mê. Tôi hy vọng bạn không phiền nếu tôi bao gồm một liên kết đến bài đăng trên blog của bạn về chủ đề này ["Parent Watching it's Child"] (http: //www.cimgf.com/2011/10/14/parent-watching-its-child /) và cũng là một plug cho cuốn sách của bạn ["Core Data"] (http://www.amazon.com/Core-Data-Apples-API-Persisting/dp/1934356328/ref = sr_1_3? ie = UTF8 & qid = 1319500666 & sr = 8-3) Tôi đã tham chiếu nó thường xuyên. Ngoài ra, trong trường hợp của tôi, điều khác tôi cần làm là tạo ra các Accessitive nguyên thủy cho dấu thời gian trong lớp con NSManagedObject, để ngăn nó đi vào một vòng lặp thông báo vô hạn. –

1

Trong câu trả lời khác tôi thấy 1,2 và 3 quá không hiệu quả. Cụ thể là 2 và ví dụ trong bài đăng trên blog "Phụ huynh xem con của nó". Vấn đề của tôi với điều đó là mọi phụ huynh đơn lẻ phải trả lời thông báo ngữ cảnh và về cơ bản mọi đối tượng được lưu nếu nó là đứa trẻ (đừng bận tâm đến thực tế ContextDidSave thích hợp hơn trong trường hợp đó!). Thay vào đó, tôi sẽ đề xuất một tùy chọn 4:

  1. Ghi đè con đã lưu và phát NSManagedObjectContextDidSaveNotification chứa phụ huynh.

Giải pháp của tôi hiệu quả hơn và cảm thấy hướng đối tượng hơn với tôi vì đối tượng đang thay đổi đang phản hồi thay đổi của chính nó. Để thực hiện điều này, trong việc sử dụng đối tượng trẻ:

-(void)didSave{ 
    [super didSave]; 
    // notify that the parent has changed. 
    [[NSNotificationCenter defaultCenter] postNotificationName:NSManagedObjectContextObjectsDidChangeNotification 
                 object:self.managedObjectContext 
                 userInfo:@{NSUpdatedObjectsKey : [NSSet setWithObject:self.parent]}];; 
} 

Để cập nhật các dấu thời gian phụ huynh, giải pháp gọn gàng sau (second last post) Tôi đã sử dụng có thể giúp đỡ, ví dụ trong việc sử dụng mẹ:

- (void) awakeFromInsert 
{ 
    [super awakeFromInsert]; 
    // set the default dates 
    NSDate* date = [NSDate date]; 
    self.timestamp = date; 
    //allow any future modifications to change the timestamp 
    _finishedStartup = YES; 
} 

- (void) awakeFromFetch 
{ 
    [super awakeFromFetch]; 
    // we should already have creation and modified dates. 
    _finishedStartup = YES; 
} 

- (void) didChangeValueForKey: (NSString *) thisKey 
{ 
    [super didChangeValueForKey: thisKey]; 

    if(![thisKey isEqualToString:@"timestamp"] && // prevent infinite loop 
     ![self isFault] && 
     ![[[self managedObjectContext] undoManager] isUndoing] && 
     _finishedStartup) // ensures we arent being called by the object being loaded from fetched data. 
    { 
     self.timestamp = [NSDate date]; 
    } 
} 
Các vấn đề liên quan