Tôi có một mô hình Core Data đại diện cho một hướng dẫn viên TV trên iOS 4+, với 3 lớp:Hiệu suất: mối quan hệ Core Data được faulted sau khi được giao
Channel
(BBC 1)Program
(Top Gear)Broadcast
(Top Gear trên BBC 1 hôm thứ Hai tại 20:00)
tôi có khoảng 40 kênh, 8000 chương trình và 6000 chương trình phát sóng, và tôi muốn tinh chỉnh im cổng quá trình để nó không mất đến một phút để chạy.
Nhập kênh và chương trình thật dễ dàng vì đây là các đối tượng độc lập. Tuy nhiên, một phát sóng có mối quan hệ với một kênh và một chương trình (1 đến nhiều người) và cả hai kênh và chương trình đều có mối quan hệ nghịch đảo với các chương trình phát sóng (nhiều-tới-1). Để tăng tốc mọi thứ, tôi có từ điển trong bộ nhớ của các kênh và chương trình lỗi chỉ có mã nhận diện Dịch vụ Web của chúng: đã tạo chương trình phát và xem qua cả hai từ điển để nhận kênh và chương trình tương ứng mà không có chuyến đi khứ hồi tới cơ sở dữ liệu.
Nhưng khi tôi chỉ định chương trình hoặc kênh phát sóng, kênh và truy cập mối quan hệ nghịch đảo của chương trình sẽ kích hoạt lỗi của cả hai đối tượng ngay lập tức, gây ra sự sụt giảm lớn (6000 * 2 yêu cầu) và áp lực bộ nhớ hậu quả như được hiển thị trong báo cáo Lỗi dữ liệu cốt lõi. Tôi đã thử tìm nạp trước mối quan hệ broadcasts
trên cả hai kênh và chương trình, nhưng mối quan hệ vẫn bị lỗi.
Bạn có biết tại sao các mối quan hệ nghịch đảo bị truy cập và lỗi cha mẹ của họ không? Làm thế nào để tránh đọc từ cơ sở dữ liệu khi lưu một mối quan hệ?
CẬP NHẬT: Mã mẫu, phương pháp ấn định/cập nhật của tôi cho phiên bản Broadcast
. Biến số dictionary
xuất phát từ Dịch vụ web và channels
và programs
chứa các kênh và chương trình lỗi được lập chỉ mục theo số nhận dạng Dịch vụ web. Lỗi xảy ra trên các dòng self.program = program
và self.channel = channel
.
- (BOOL)assignWithDictionary:(NSDictionary *)dictionary channels:(NSDictionary *)channels programs:(NSDictionary *)programs {
// Add channel relationship
NSNumber *channelIdentifier = [dictionary objectForKey:@"channel_id"];
if (self.channel == nil || ![self.channel.identifier isEqualToNumber:channelIdentifier]) {
Channel *channel = [channels objectForKey:channelIdentifier];
if (channel == nil) {
NSLog(@"Broadcast %@ has invalid channel: %@", identifier, channelIdentifier);
return NO;
}
self.channel = channel;
}
// Same to add a program relationship
// ...
}
và Mỹ lấy yêu cầu để có được các kênh hoặc danh sách các chương trình:
- (NSDictionary *)itemsForEntity:(NSEntityDescription *)entity {
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
NSError *error = nil;
NSArray *itemsArray = nil;
request.entity = entity;
request.relationshipKeyPathsForPrefetching = [NSArray arrayWithObject:@"broadcasts", nil];
request.propertiesToFetch = [NSArray arrayWithObjects:@"identifier", @"version", nil];
itemsArray = [self.context executeFetchRequest:request error:&error];
NSAssert1(error == nil, @"Could not fetch the items from the database: %@", error);
{
NSMutableDictionary *items = [NSMutableDictionary dictionaryWithCapacity:itemsArray.count];
for (NSManagedObject *item in itemsArray) {
[items setObject:item forKey:[item valueForKey:@"identifier"]];
}
return [NSDictionary dictionaryWithDictionary:items];
}
}
+1, bởi vì tôi đã từng có một vấn đề rất giống với vấn đề mà tôi không thể giải quyết - cuối cùng cũng làm mọi việc hoàn toàn khác. Tôi vẫn tò mò về những gì tôi có thể làm về nó, mặc dù. – Toastor
Bạn "chương trình hoặc kênh phát sóng" bằng cách chỉ sử dụng "số nhận dạng"? Tôi cho rằng "số nhận dạng" là một managedObjectID hoặc một URI giống nhau? Tôi sẽ đề nghị hiển thị mã nơi bạn làm điều này. – TechZen
Tôi đang nhận dữ liệu từ Dịch vụ web mô tả các mối quan hệ sử dụng số nhận dạng, không có gì liên quan đến Id dữ liệu lõi (tôi đã đề cập) – ndfred