2015-06-12 18 views
9

Tôi có hai thực thể trong Dữ liệu chính (xem bên dưới) và sử dụng NSFetchedResultsController với [NSPredicate predicateWithFormat:@"calendar.subscribed == 1"]; để trích xuất đối tượng "Sự kiện".Dữ liệu cốt lõi NSPredicate cho các mối quan hệ không hoạt động sau khi [context save]

Lịch

  • đăng ký mua (BOOL)
  • sự kiện (one-to-many mối quan hệ với "sự kiện")

Event

  • lịch (nhiều-to- một mối quan hệ với "Lịch")

Mọi thứ hoạt động tốt, nhưng nếu tôi thay đổi subscribed thuộc tính của một số "Lịch" và lưu ngữ cảnh trong chủ đề khác, controllerDidChangeContent không được gọi.

Tôi có thể buộc tải lại không? và làm thế nào?

+0

Bạn có thể xóa vị từ của mình để nhận tất cả thay đổi đối với Sự kiện, sau đó kiểm tra cờ đăng ký theo cách thủ công trong phương thức ủy quyền của bạn. –

+0

Hoặc bạn có thể tìm nạp từ thực thể Lịch nơi cờ đã đăng ký được đặt sau đó tìm nạp tất cả Sự kiện được liên kết theo phương thức đại biểu của bạn –

Trả lời

0

Đáng buồn là FRC chỉ giám sát các đối tượng là đối tượng tìm nạp (trong trường hợp của bạn là Event). Vì vậy, nó không nhận ra những thay đổi đối với các thuộc tính của các đối tượng liên quan, mặc dù những thay đổi đó có thể ảnh hưởng đến cách biến vị ngữ đánh giá.

Một cách giải quyết khác là khi bạn thay đổi giá trị thuộc tính của đối tượng Calendar, để thay đổi giá trị trên đối tượng Event được liên kết với giá trị hiện tại - không thay đổi về lý thuyết, nhưng đủ để kích hoạt FRC để đánh giá lại vị từ cho rằng Event.

+0

cảm ơn, nhưng tôi vẫn muốn mở câu hỏi của mình và xem liệu chúng tôi có thể có giải pháp tốt hơn hay không. –

+0

Chắc chắn - Tôi muốn một giải pháp sạch hơn bản thân mình. – pbasdf

0

Như đã đề cập trong câu trả lời khác, NSFetchedResultsController chỉ nhận các thay đổi đối với đối tượng Sự kiện chứ không phải là Lịch. Để lực làm mới, bạn có thể gửi một NSNotification bất cứ nơi nào bạn cập nhật tình trạng đăng ký mua của lịch ngay sau khi bạn gọi 'saveContext':

[[NSNotificationCenter defaultCenter] postNotificationName:@"calendarSubscriptionUpdated" object:nil]; 

Sau đó, thêm một người quan sát trong lớp bạn muốn cập nhật:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateEventData:) name:@"calendarSubscriptionUpdated" object:nil]; 

Điền một phương thức 'updateEventData' (hoặc bất kỳ thứ gì bạn muốn gọi nó) bằng mã để chạy tìm nạp và bạn nên làm tốt.

0

Bạn có thể thêm quan sát viên tới Calendar.subscribed trong tổ chức sự kiện

-(void)awakeFromFetch { 
    [ self addObserver:self 
      forKeyPath:@"calendar.subscribed" 
       options:NSKeyValueObservingOptionNew 
       context:NULL ]; 
} 

- (void)observeValueForKeyPath:(NSString *)keyPath 
         ofObject:(id)object 
         change:(NSDictionary *)change 
         context:(void *)context { 
    if ([keyPath isEqualToString:@"calendar.subscribed"]) { 
     [ self willChangeValueForKey:@"anyProperty" ]; 
     [ self didChangeValueForKey:@"anyProperty" ]; 
    } 
} 

-(void)willTurnIntoFault { 
    [ super willTurnIntoFault]; 
    [ self removeObserver:self forKeyPath:@"calendar.subscribed" ]; 
} 

Thay vì "anyProperty" sử dụng tên tài sản thực của các sự kiện. Tôi đã sử dụng cách tiếp cận tương tự trước khi nó hoạt động.

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