【问题标题】:the object is not being turned into a fault对象没有变成故障
【发布时间】:2013-08-06 22:17:48
【问题描述】:

问题随机出现...

Crashing Location(这是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
}];

我将 managedObjectContentChild 用于 NSEntityDescription。 但是,通过 managedObjectContent 执行FetchRequest,它是 managedObjectContentChild 的父级。 这是潜在的问题吗?

我尝试了 managedObjectContentChild 的 executeFetchRequest,但是,它会导致更多不同的问题。

但是,我必须使用 managedObjectContentChild,因为程序通过为单个线程创建新的 CoreDataManager 实例在多个线程中运行。如果不使用子 MOC,程序将陷入僵局。

提前致谢!

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;
}

我试图弄清楚以下讨论,但仍然不知道该怎么做...... 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

【问题讨论】:

    标签: ios core-data nsmanagedobjectcontext fault


    【解决方案1】:

    问题来了,

    // 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) 不会导致对象不转fault的错误导致应用每次都崩溃,但是如果应用碰巧使用相同的MOC(嗯,只有一个managedObjectContext在这种情况下)在完全相同的时刻,即使来自不同的线程。

    【讨论】:

      猜你喜欢
      • 2012-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-25
      • 1970-01-01
      相关资源
      最近更新 更多