Core Data的线程错误

时间:2013-01-29 04:00:07

标签: ios xcode core-data nsmanagedobject uimanageddocument

我正在开发一个与服务器通信的应用程序,并保存到核心数据。

在appDelegate中,我启动了我的单例对象并调用了useDocument来初始化UIManagedDocument:

- (void)useDocument
{
    if (![[NSFileManager defaultManager] fileExistsAtPath:self.database.fileURL.path]){ 

        [self.database saveToURL:self.database.fileURL forSaveOperation:UIDocumentSaveForCreating completionHandler:nil];

    } else if (self.database.documentState == UIDocumentStateClosed){

        [self.database openWithCompletionHandler:nil];
    }
}

从服务器接收数据后继承代码:

- (void)downloadCompletedWithData: (NSData *)data item: (TPDownloadItem *)finishedItem;
{
    // parse data and update core
    NSError *error;
    id dataObject = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error];
    if (dataObject && !error){

        dispatch_async(dispatch_get_main_queue(), ^{

            [User createUserWithInfo:dataObject inManagedContext:self.database.managedObjectContext];
        });
    }
}

继承了写入核心数据的代码:

+ (id)createUserWithInfo: (NSDictionary *)userInfo inManagedContext: (NSManagedObjectContext *)aContext
{
    NSError *error;
    User *aUser = [NSEntityDescription insertNewObjectForEntityForName:ENTITY_NAME inManagedObjectContext:aContext];

    NSString *userID = [userInfo objectForKey:USER_ID];

    aUser.userID = userID;
    aUser.effective = [NSNumber numberWithBool:[[userInfo objectForKey:USER_EFFECTIVE] boolValue]];
    aUser.job = [userInfo objectForKey:USER_JOB];
    aUser.gender = [userInfo objectForKey:USER_GENDER];

    return aUser;
}

问题是每当核心数据尝试自动保存(等待大约30秒)时,应用程序崩溃时会出现以下错误:

我试图在主线程中使用GCD调用“useDocument”和“createUser”,同时覆盖UIDocument“contentsForType”以确保它在自动保存之后发生,文档状态在保存之前是正常的,并且持久性存储文件也是创建。

  • 有没有人遇到类似的情况?非常感谢任何帮助!!

2 个答案:

答案 0 :(得分:0)

问题有点固定,我不得不关闭并重置手机才能让它工作......

但仍然不知道为什么会发生这种情况

答案 1 :(得分:0)

托管上下文不是线程安全的,但您可以拥有任意数量的托管上下文,这可能与此有关。也许删除调度异步,你不需要它,因为你在主线程上做代码。

我在数据管理器类中创建了一个后台管理的上下文,在那里我完成了所有的写操作,当我需要时,我会监听一个通知名称MANAGEDCONTEXTDIDSAVE并在需要时重新加载。

像魅力一样。