2011-11-25 38 views
3

我想在辅助线程中插入数据,然后跟踪主线程中的变化。关于核心数据和关系的并发性

我有两个实体,他们被设置为逆。

@interface Entity1 : NSManagedObject 
    @property (nonatomic, retain) NSString * data; 
    @property (nonatomic, retain) Entity2 * entity2; 
@end 
@interface Entity2 : NSManagedObject 
    @property (nonatomic, retain) Entity1 * entity1; 
@end 

我注册环境保存notificaton在主线程。

//this managedObjectContext run in main thread 
-(NSManagedObjectContext *)managedObjectContext_mainThread { 
     ...... 
     [[NSNotificationCenter defaultCenter] 
           addObserver:self 
          selector:@selector(contextDidSave:) 
           name:NSManagedObjectContextDidSaveNotification         
           object:nil];  

     return managedObjectContext_mainThread ; 
} 

//pass notification 
- (void)contextDidSave:(NSNotification *)notification 
{ 
...... 
    [managedObjectContext_mainThread 
       mergeChangesFromContextDidSaveNotification:notification]; 

} 

取从coredata,它会在主线程

-(NSFetchedResultsController *)fetchedResultsController 
{ 
    if (fetchedResultsController == nil) { 
    NSManagedObjectContext *moc = [self managedObjectContext_mainThread]; 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Entity2"   
                 inManagedObjectContext:moc]; 
    NSSortDescriptor *sd = [[NSSortDescriptor alloc] initWithKey:@"entity1" 
                   ascending:YES]; 
    ..... 

    } 

    return fetchedResultsController; 
    } 

    //NSFetchedResultsControllerDelegate, in this functions updata my UI 
    -(void)controllerDidChangeContent:(NSFetchedResultsController *)controller 
    { 
NSLog(@"controllerDidChangeContent start!"); 

    } 

这是应用开始运行。

-(void)loadView { 

    myQueue = dispatch_queue_create("myQueue", NULL); 

    // this context is managedObjectContext_mainThread and run in main thread 
    NSArray *results = [self fetchedResultsController]; 

    //insert Data oparation in managedObjectContext_otherThread and myQueueu 
    dispatch_async(myQueue, ^{ 
     ......  
    Entity1 *entity1 = 
        [NSEntityDescription insertNewObjectForEntityForName:@"Entity1" 
          inManagedObjectContext:managedObjectContext_otherThread]; 
    Entity2 *entity2 = 
        [NSEntityDescription 
        insertNewObjectForEntityForName:@"Entity2" 
           inManagedObjectContext:managedObjectContext_otherThread]; 
    entity1.data = @"myData"; 
    entity1.entity2 = entity2; 
     [[self managedObjectContext_otherThread] save:nil]; 
    }); 
    } 

当我建立我得到一个错误

-[Entity1 compare:]: unrecognized selector sent to instance 0x4d3ec90 

和错误发生在NSFetchedResultsController手柄方面的通知,这是调用堆栈:

__exceptionPreprocess + 185 
objc_exception_throw + 47 
-[NSObject(NSObject) doesNotRecognizeSelector:] + 187 
___forwarding___ + 966 
CF_forwarding_prep_0 + 50 
_NSCompareObject + 76 
+[NSFetchedResultsController(PrivateMethods) 
    _insertIndexForObject:inArray:lowIdx:highIdx:sortDescriptors:] + 286 
-[NSFetchedResultsController(PrivateMethods) _postprocessInsertedObjects:] + 402 
-[NSFetchedResultsController(PrivateMethods) _managedObjectContextDidChange:] + 1804 

如果我不取在Entity2但在Entched1 fetchedResultsController,我的应用程序运行ok.but我想获取entity2,然后使用entity2.entity1.data访问entity1.who可以帮助我。

回答

1

我发现我的错误,我用关系在fetchrequest中排序描述符。

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Entity2"   
                inManagedObjectContext:moc]; 
NSSortDescriptor *sd = [[NSSortDescriptor alloc] initWithKey:@"entity1" 
                  ascending:YES]; 

如果我使用其他属性作为sortdescriptor,应用程序将会正常。