2012-03-20 34 views
9

Xin chào (câu hỏi thực tế ở dưới cùng).Làm cách nào để hợp nhất các thay đổi từ một bối cảnh đối tượng được quản lý con cho một ngữ cảnh khác thông qua MOC mẹ?

Trong iOS 5, có sự ra đời của bối cảnh đối tượng được quản lý cha-con trong CoreData.

Tôi có NSFetchedResultsController và UITableVeiwController tiêu chuẩn làm việc cùng nhau để tìm nạp danh sách tổng thể từ cửa hàng. bối cảnh đối tượng quản lý kết quả lấy điều khiển là một đứa trẻ với một bối cảnh cha mẹ:

// AppDelegate.m 

- (NSManagedObjectContext *)managedObjectContext 
{ 
    if (__managedObjectContext != nil) 
    { 
     return __managedObjectContext; 
    } 

    __managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; 

    // primary managed object context has NSPrivateQueueConcurrencyType 
    [__managedObjectContext setParentContext:[self primaryObjectContext]]; 
    return __managedObjectContext; 
} 

Bảng

xem điều khiển trình bày một bộ điều khiển xem phương thức để thêm một kỷ lục mới, nhưng sử dụng một bối cảnh đối tượng được quản lý riêng biệt để làm như vậy (bối cảnh này là một đứa trẻ khác trong ngữ cảnh gốc). Bối cảnh này được lưu trong một callback đại biểu trong bộ điều khiển xem bảng:

- (void)addGame 
{ 
    // New child context 

    [self setBuildManagedObectContext:[[NSManagedObjectContext alloc] init]]; 
    [[self buildManagedObectContext] setParentContext:[[[self team] managedObjectContext] parentContext]]; 

    Team *buildTeam = (Team *)[[self buildManagedObectContext] objectWithID:[[self team] objectID]]; 
    Game *buildGame = [NSEntityDescription insertNewObjectForEntityForName:@"Game" 
               inManagedObjectContext:[self buildManagedObectContext]]; 


    [buildGame setTeam:buildTeam]; 

    BuildViewController *buildVC = [[BuildViewController alloc] initWithGame:buildGame delegate:self]; 
    UINavigationController *navCon = [[UINavigationController alloc] initWithRootViewController:buildVC]; 
    [[self navigationController] presentViewController:navCon animated:YES completion:nil]; 
} 

#pragma mark - Build view controller delegate 

- (void)buildViewController:(BuildViewController *)controller didFinishWithSave:(BOOL)save 
{ 
    if (save) 
    { 
     NSError *error = nil; 
     if (![[self buildManagedObectContext] save:&error]) 
     { 
      NSLog(@"Error saving new game"); 
      abort(); 
     } 
    } 
    [self setBuildManagedObectContext:nil]; 
    [[self navigationController] dismissViewControllerAnimated:YES completion:nil]; 
} 

Câu hỏi:

Đó là sự hiểu biết của tôi rằng với bối cảnh cha-con, bối cảnh cha mẹ sẽ nhận được lưu thông báo từ con của nó, và sau đó thông báo cho tất cả các con của nó. Vì vậy, trong ví dụ của tôi, bối cảnh xây dựng nên kích hoạt bối cảnh gốc để báo cho bộ điều khiển kết quả đã tìm nạp kết hợp các thay đổi.

Điều này không xảy ra đối với tôi, các bản ghi được tạo thành công, nhưng bộ điều khiển kết quả được tìm nạp không chọn chúng. Tôi biết nó được sử dụng để được các trường hợp bạn đã phải thực hiện bạn sở hữu hợp nhất từ ​​các thông báo lưu (như đã thấy trong CoreDataBooks). Nhưng tôi nghĩ rằng bối cảnh con-cha mẹ giải quyết vấn đề này. Tôi đã cố gắng cứu đứa trẻ và sau đó là cha mẹ, nhưng dường như không tạo ra sự khác biệt. Ai đó có thể giải thích điều này cho tôi được không? (Lưu ý: Đây không phải là bối cảnh trên đề/nền riêng biệt)

Nhiều Cảm ơn

Trả lời

14

Theo trình bày WWDC 2011 cho "Có gì mới trong Core Data" nó nói bạn nên lưu như thế này:

[child save:&error]; 
[parent performBlock:^{ 
    [parent save:&parentError]; 
}]; 

Từ sự hiểu biết của tôi, điều này làm cho phụ huynh nhận và hợp nhất các thay đổi từ ngữ cảnh con. Một điều cần lưu ý là cha mẹ và tất cả trẻ em phải được tạo với cùng một loại tương tranh.

- Chỉnh sửa giả định không chính xác đã xóa mà phụ huynh đẩy thay đổi cho trẻ em, nó không.

+0

Cảm ơn, tôi vẫn gặp sự cố với trình điều khiển kết quả được tìm nạp, chọn lưu trên phụ huynh. hmmm:/ – Cameron

+0

Bạn có đang triển khai đúng 4 phương thức ủy nhiệm FRC quan trọng không? Nếu vậy bạn có thể thử nói FRC của bạn thực thi nó lấy lại lần nữa, hoặc phá hủy nó và tạo lại nó. Tạo và phá hủy FRCs là một hoạt động tương đối rẻ. Tôi xử lý một vấn đề tương tự nhưng trong kịch bản của tôi, vị ngữ của tôi cần phải thay đổi nhân dịp. Tôi làm hỏng việc phá hủy và tái tạo các FRC của tôi và nói với tableview của tôi để tải lại dữ liệu của nó. – afrederick

+0

Yep đại biểu chỉ là phương pháp tiêu chuẩn. Vẫn không làm việc, thậm chí rách xuống frc. Sẽ tiếp tục thử những thứ khác nhau. Đánh giá cao sự giúp đỡ mặc dù. – Cameron

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