0

The problem randomly occurs...

Crashing Location (which is a method in NSOperationQueue)

[self.requestOperationQueue addOperationWithBlock: ^{

    NSArray *titleList = [[NSMutableArray alloc] init];
    NSArray *allBooks = [[CoreDataManager sharedInstance] fetchBooks];

    for (Book *book in allBooks)
        [titleList addObject:book.title];   // program crashed here!! failed to fault the value of book.title
}];

I use managedObjectContentChild for NSEntityDescription. However, executeFetchRequest by managedObjectContent, which is the parent of managedObjectContentChild. Is that the potential problem?

I tried executeFetchRequest by managedObjectContentChild, however, it leads many more different issues.

However, I am binded to use managedObjectContentChild since program is running in multiple threads by create new CoreDataManager instance for individual thread. Program will run into deadlock without using children MOC.

Thanks in advance!

CoreDataManager.m

- (id)init
{
if ((self = [super init]) != nil)
{
    delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

    // Writer (write data to Persistent Store Coordinator)
    writerManagedObjectContext = [delegate writerManagedObjectContext];

    // Parent (Fetched Result Controller)
    managedObjectContext = [delegate managedObjectContext];

    // Child (handling Object Context Saving for individual threads)
    managedObjectContextChild = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
    managedObjectContextChild.parentContext = managedObjectContext;

    bookEntity = [NSEntityDescription entityForName:[Book description]
                                    inManagedObjectContext:managedObjectContextChild];

    friendEntity = [NSEntityDescription entityForName:[Friend description] 
                                    inManagedObjectContext:managedObjectContextChild];
    }
    return self;   
}


- (NSArray *)fetchBooks
{
    // Todo: fix the problem of "CoreData: error: NULL _cd_rawData but the object is not being turned into a fault"

    NSArray *results = nil;

    if (key == nil)
        return results;

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:key ascending:ascending];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entity];
[request setPredicate:predicate];
[request setSortDescriptors:sortDescriptors];

    NSError *error = NULL;

    //    results = [managedObjectContextChild executeFetchRequest:request error:&error];
    results = [managedObjectContext executeFetchRequest:request error:&error];

    if (error != NULL)
    NSLog(@"Error fetching - %@", error);

return results;
}

I tried to figure out the following discussion, but still have no clue how to do it... CoreData: error: NULL _cd_rawData but the object is not being turned into a fault http://www.cocoabuilder.com/archive/cocoa/311615-weird-core-data-crash.html

4

1 回答 1

0

问题来了,

// use this one
results = [managedObjectContextChild executeFetchRequest:request error:&error];
// not this
// results = [managedObjectContext executeFetchRequest:request error:&error];

所以我使用 managedObjectContextChild(子 MOC)而不是 managedObjectContext(父 MOC),以便为每个单独的线程创建不同的 MOC。作为CoreData的并发规则。

使用 managedObjectContext (parent MOC) 不会导致 object not turn to fault 的错误并且每次都使应用程序崩溃,但是如果应用程序恰好使用相同的 MOC (好吧,在这种情况下只有一个 managedObjectContext ) 在完全相同的时刻,即使来自不同的线程。

于 2013-08-14T21:20:15.483 回答