在核心数据中调用refreshAllObjects将冻结UI

我的项目中有两个NSmanagedobjectcontext,一个用于主队列,另一个用于私有队列。当我的应用程序启动时,主队列上下文从实体A获取数据,并将其显示在表视图中。同时,它尝试删除实体B中的无效数据,并且这部分数据不需要在启动时显示。但是,当实体A有数千条记录时,调用方法refreshAllObjects会花费很长时间。我对Core Data中的多线程不太熟悉,我认为应该有一些方法可以解决此问题。

这是我的代码段。

// initialization
NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:mom];
self.privateMoc = [[NSmanagedobjectcontext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
self.privateMoc.persistentStoreCoordinator = psc;
self.mainmoc = [[NSmanagedobjectcontext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
self.mainmoc.parentContext = self.privateMoc;

// delete invalid data
[self.mainmoc performBlock:^{
    NSFetchRequest<CustomClass *> *fetchRequest = [[NSFetchRequest alloc] init];
    fetchRequest.entity = [NSEntityDescription entityForName:MyEntity inmanagedobjectcontext:self.mainmoc];
    fetchRequest.predicate = [NSPredicate predicateWithFormat:@"isInvalid == 1"];
    NSError *error;
    NSBatchDeleteRequest *deleteRequest = [[NSBatchDeleteRequest alloc] initWithFetchRequest:fetchRequest];
    [self.mainmoc executeRequest:deleteRequest error:&error];
    [self.mainmoc refreshAllObjects];   // this method takes a few seconds
}];

我的猜测是,由于删除操作与用户界面无关,因此也许我可以将此操作推送到私有上下文,这样它就会变成这样:

[self.mainmoc performBlock:^{
    [self.privateMoc performBlock:^{
        // copy code above and change all mainmoc to privateMoc
        ......
    }];
}];

这时,主线程没有被阻塞,但是我不确定这是否是正确的方法。

gn666 回答:在核心数据中调用refreshAllObjects将冻结UI

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3073152.html

大家都在问