我已经设置了几种使用NSOperationQueue在后台加载核心数据的方法,如下所示:
operation = [[NSInvocationOperation alloc] initWithTarget:self
selector:@selector(selectToLoadDataOne) object:nil];
operation = [[NSInvocationOperation alloc] initWithTarget:self
selector:@selector(selectToLoadDataTwo) object:nil];
“selectToLoadDataOne”和“selectToLoadDataTwo”只是使用来自app delegate的模板NSManagedContext的标准NSFetchRequest。 问题是加载几次后,它只是完全停止加载并停留在executeFetchRequest:并且没有任何错误。
我知道这与使用核心数据的线程有关,因此我尝试为每个调用创建一个新的nsmanagedobjectcontext,但返回的结果是空的nsmanagedobject。
有人能指出我可以用来解决从后台线程加载核心数据的好例子或文档吗?
答案 0 :(得分:1)
Core Data有关于在多个线程上运行的非常特定规则。每个线程必须有一个NSManagedObjectContext
,并且NSManagedObjectContext
将使用的线程必须是创建它的线程。
您正在遇到问题,因为您违反了该规则。
而不是使用NSInvocationOperation
:
NSOperation
NSPersistentStoreCoordinator
NSManagedObjectContext
醇>
当然只会将它们加载到NSPersistentStoreCoordinator
中,您仍然需要在主NSManagedObjectContext
中重新加载它们。
为什么需要在后台线程上加载数据?寻求加速数据加载通常表明应用程序中存在更深层次的问题。