2010-03-08 37 views
7

Tôi đang gặp sự cố khi tôi cập nhật mối quan hệ nhiều-nhiều trong chuỗi nền, hoạt động tốt trong luồng đó, nhưng khi tôi gửi đối tượng trở lại chính chuỗi các thay đổi không hiển thị. Nếu tôi đóng ứng dụng và mở lại dữ liệu sẽ được lưu và các thay đổi sẽ hiển thị trên chuỗi chính. Cũng sử dụng [bối cảnh khóa] thay vì một bối cảnh đối tượng được quản lý khác hoạt động tốt.Đồng bộ hóa chủ đề bối cảnh đối tượng được quản lý dữ liệu lõi

Tôi đã thử NSManagedObjectContext:

- (BOOL)save:(NSError **)error; 
- (void)refreshObject:(NSManagedObject *)object mergeChanges:(BOOL)flag;  

ở các giai đoạn khác nhau trong suốt quá trình nhưng nó không có vẻ để giúp đỡ.

mã dữ liệu cốt lõi của tôi sử dụng các phương thức getter sau để đảm bảo bất kỳ hoạt động là chủ đề an toàn:

- (NSManagedObjectContext *) managedObjectContext 
{ 

    NSThread * thisThread = [NSThread currentThread]; 
    if (thisThread == [NSThread mainThread]) 
    { 
     //Main thread just return default context 
     return managedObjectContext; 
    } 
    else 
    { 
     //Thread safe trickery 
     NSManagedObjectContext * threadManagedObjectContext = [[thisThread threadDictionary] objectForKey:CONTEXT_KEY]; 
     if (threadManagedObjectContext == nil) 
     { 
      threadManagedObjectContext = [[[NSManagedObjectContext alloc] init] autorelease]; 
      [threadManagedObjectContext setPersistentStoreCoordinator: [self persistentStoreCoordinator]]; 
      [[thisThread threadDictionary] setObject:threadManagedObjectContext forKey:CONTEXT_KEY]; 
     } 

     return threadManagedObjectContext; 
    } 
} 

và khi tôi vượt qua đối tượng giữa các chủ đề Tôi đang sử dụng

-(NSManagedObject*)makeSafe:(NSManagedObject*)object 
{ 
    if ([object managedObjectContext] != [self managedObjectContext]) 
    {    
     NSError * error = nil; 
     object = [[self managedObjectContext] existingObjectWithID:[object objectID] error:&error]; 

     if (error) 
     { 
      NSLog(@"Error makeSafe: %@", error); 
     } 
    } 

    return object; 
} 

Bất kỳ giúp đánh giá cao

+0

Chỉnh sửa: Tôi đã bỏ lỡ rằng bạn đã sử dụng threadDictionary trước đó. – Wendel

Trả lời

9

Nếu bạn lưu bối cảnh nền trên chuỗi nền và sau đó nghe NSManagedObjectContextObjectsDidChangeNotification trên chủ đề chính, bạn có thể gọi -mergeChangesFromContextDidSaveNotification: trên bối cảnh chính (trên chủ đề chính) và các thay đổi sẽ hiển thị ngay sau khi bạn thực hiện lưu trên chuỗi nền.

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