2012-03-11 2 views
9

Tôi đã thiết lập lược đồ dữ liệu lõi đơn giản, nơi các đối tượng mục được thêm vào các đối tượng danh sách. Sau khi tạo các lớp, dữ liệu lõi đã tạo ra các trình truy cập chuẩn, bao gồm một vài cách để thêm các mục vào một danh sách (list.addItemsObjects và list.addItems :).Tùy biến các trình truy cập dữ liệu lõi được tạo

Tôi cũng muốn thêm một 'dateAdded' NSDate vào mỗi mục. Bây giờ, tôi có thể tự thiết lập điều này mỗi khi tôi tạo một đối tượng, vì dữ liệu lõi sẽ cung cấp cho tôi một accessor item.dateAdded. Nhưng thực sự, tôi thích rằng điều này được xử lý bởi chính danh sách, vì việc triển khai sẽ không bao giờ thay đổi. Vì vậy, mỗi khi tôi gọi list.AddItemObject, tôi muốn nó đặt thuộc tính dateAdded của mục cùng một lúc. Tôi đoán tôi cũng sẽ cần phải làm tương tự trong nghịch đảo, do đó, item.setList cũng đặt dateAdded.

Tôi không chắc chắn cách thực hiện việc này. Tôi có nên thử định nghĩa lại các trình truy cập dữ liệu cốt lõi hiện có không? Nếu vậy, làm thế nào để tôi làm điều này (có cách nào đó để gọi triển khai ban đầu bên trong mã tùy chỉnh của tôi, sao cho mối quan hệ nghịch đảo được xử lý và bất kỳ nhu cầu dữ liệu cốt lõi nào khác)? Hoặc là có một số cách tốt hơn để tùy chỉnh các phương pháp này?

Trả lời

8

Bạn có thể ghi đè các trình truy cập dữ liệu lõi được tạo. Bạn phải chú ý đến một vài điều đặc biệt như gọi số willChangeValueForKeydidChangeValueForKey, nhưng ngoài việc ghi đè số người truy cập thì cũng giống như mọi khi.

Đọc tài liệu Apple: https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdAccessorMethods.html

Giải thích rõ ràng với nhiều ví dụ. Chỉ cần chú ý đến sự khác biệt giữa quan hệ một-một và một-nhiều.

Bạn không cần triển khai chức năng nghịch đảo, điều này được thực hiện bởi Dữ liệu cốt lõi. Nếu bạn gọi list.AddItem, thì item.setList sẽ tự động được gọi cho bạn.

Vì vậy, chỉ cần thêm mã mong muốn của bạn vào bộ truy cập item.setList. Bằng cách đó, bạn đảm bảo rằng mọi mục được thêm vào danh sách ngày được cập nhật tương ứng. Đừng bận tâm với danh sách truy cập.

Mã của bạn sẽ là một cái gì đó như:

- (void)setList:(List *)value 
{ 
    [self willChangeValueForKey:@"list"]; 
    [self setPrimitiveValue:[NSDate date] forKey:@"dateAdded"]; // use setValue:forKey: if you need KVO for dateAdded 
    [self setPrimitiveValue:value forKey:@"list"]; 
    [self didChangeValueForKey:@"list"]; 
} 

EDIT Tôi đã cho nó suy nghĩ khác và bạn có thể muốn biết những điều sau:

Nếu bạn tùy chỉnh các phương pháp danh sách (ví dụ addItemObject), bạn cũng sẽ cần phải tùy chỉnh setItems. Ngoài ra, nếu mặt hàng của bạn được thêm vào danh sách xảy ra không phải là danh sách bạn đã tùy chỉnh, mã tùy chỉnh của bạn dĩ nhiên không được gọi.

Mặt khác, nếu bạn tùy chỉnh phương pháp setList, mã là không phải được gọi nếu không có thay đổi nào đối với mặt hàng đó.

Ví dụ, nếu bạn gọi

[list addItems:[NSSet setWithObject:item]]; 
[list addItemsObject:item]; 

sau đó setList accessor của item sẽ chỉ được gọi một lần! Các cuộc gọi trực tiếp đến item.setList luôn được gọi, ngay cả khi không có gì thay đổi.

+0

Cảm ơn bạn. Tôi đã quét nó và đọc nó ngay bây giờ. Một phần tôi không thấy được đề cập - tôi có cần phải áp dụng cùng các tùy chỉnh cho các trình truy cập ngược không?Tức là sau khi tôi đã tùy chỉnh list.addItemObject, tôi cũng nên tùy chỉnh item.setList? –

+0

Tôi đã cập nhật câu trả lời cho câu hỏi của mình – JiaYow

+0

Cảm ơn, điều này rất nhiều để giúp tôi tiếp tục. Thay vì setList đơn giản hơn, mặc dù, tôi đã thêm các tùy chỉnh của mình vào nghịch đảo, list.addItemsObject (tham chiếu đến tài liệu nhiều). Tôi đã thấy rằng nó không được gọi khi tôi gọi item.setList mặc dù. –