Tôi đã làm điều gì đó tương tự như Shortseller, nhưng không sử dụng danh mục.
alt text http://i40.tinypic.com/x3ryp.png
InternationalBook
và LocalizedBook
là cả hai đối tượng tùy chỉnh quản lý với một mối quan hệ một-nhiều (một cuốn sách quốc tế để nhiều sách địa phương).
Trong việc thực hiện InternationalBook
, tôi đã thêm một accessor tùy chỉnh cho title
:
- (NSString *)title {
[self willAccessValueForKey:@"title"];
NSString *locTitle = nil;
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"locale==%@", [DataManager localeString]];
NSSet *localizedSet = [self.localizedBook filteredSetUsingPredicate:predicate];
if ([localizedSet count] > 0) {
locTitle = [[localizedSet valueForKey:@"localizedTitle"] anyObject];
}
[self didAccessValueForKey:@"title"];
return locTitle;
}
[DataManager localeString]
là một phương pháp học mà trả về ngôn ngữ và mã quốc gia của người dùng: en_US
, fr_FR
, vv Xem tài liệu hướng dẫn trên NSLocale
để biết chi tiết.
Xem phần "Phương thức thuộc tính tùy chỉnh và phương pháp truy cập mối quan hệ một-một" của Hướng dẫn lập trình dữ liệu cốt lõi để được giải thích về willAccessValueForKey:
và didAccessValueForKey:
.
Khi điền dữ liệu, tôi lấy một chuỗi đại diện cho ngôn ngữ hiện tại của người dùng ([DataManager localeString]
) và lưu trữ cùng với tiêu đề sách được bản địa hóa trong đối tượng LocalizedBook
mới. Mỗi cá thể LocalizedBook
được thêm vào NSMutableSet
, thể hiện mối quan hệ một-nhiều.
NSMutableSet *bookLocalizations = [internationalBook mutableSetValueForKey:@"localizedBook"]; // internationalBook is an instance of InternationalBook
// set the values for locale and localizedTitle
LocalizedBook *localizedBook = (LocalizedBook *)[NSEntityDescription insertnNewObjectEntityForName:@"LocalizedBook" inManagedObjectContext:self.bookMOC];
localizedBook.locale = [DataManager localeString];
localizedBook.localizedTitle = theLocalizedTitle; // assume theLocalizedTitle has been defined.
[bookLocalizations addObject:localizedBook];
[bookLocalizations setValue:localizedBook forKey:@"localizedBook"];
Kể từ khi danh hiệu cục bộ đang được lưu trữ trong đối tượng LocalizedBook
quản lý, bạn có thể làm cho title
thuộc tính một thoáng qua, nhưng nếu bạn làm điều đó bạn không thể sử dụng title
trong một vị ngữ.
Điều tốt đẹp về cách tiếp cận này là việc thực hiện mối quan hệ nhiều-nhiều là minh bạch đối với bất kỳ người tiêu dùng nào. Bạn chỉ cần yêu cầu internationalBook.title
và trình truy cập tùy chỉnh trả về giá trị thích hợp dựa trên ngôn ngữ của người dùng đằng sau hậu trường.
Thiên Chúa - hoặc tốt? :) –