我正在使用MagicalRecord lib加载一些用于填充tableview的CoreData对象。这是一个缓慢的操作,因此我试图在背景威胁上这样做。
这一切似乎进展顺利,数据被加载到self.products
,只有在一段时间(+ - 分钟)之后,所有加载的对象似乎都进入<fault>
状态。我不明白为什么会这样,有人有想法吗?
- (void)doInBackground
{
dispatch_queue_t myQueue = dispatch_queue_create("com.mycompany.myqueue", 0);
dispatch_async(myQueue, ^{
[self reloadData];
dispatch_sync(dispatch_get_main_queue(), ^{
[MBProgressHUD hideHUDForView:self.view animated:YES];
[self performSelectorOnMainThread: @selector(sortData:) withObject:self waitUntilDone:YES];
});
});
}
- (void)reloadData
{
NSArray *allProducts = [NSArray array];
allProducts = [NSArray arrayWithArray:[Product MR_findAll]];
self.products = [NSArray arrayWithArray:allProducts];
}
答案 0 :(得分:3)
首先,通过仅使用MR_findAll而不指定上下文,隐式使用默认上下文。这最终会导致崩溃或其他未知行为。其次,你不需要所有那些NSArrays。 MR_findAll(以及所有其他MR_find *方法)的返回值返回结果数组。无需将内容从数组移动到数组到数组......
最后,你的问题。因为您正在主上下文队列中进行提取,所以无论如何,您的提取都将阻止UI。您需要创建一个私有队列上下文并使用它执行提取,如下所示:
NSManagedObjectContext *privateQueueContext = [NSManagedObjectContext MR_privateQueueContext];
NSArray *results = [Product MR_findAllInContext:privateQueueContext];
此外,您可能希望查看批量提取。查看有关获取提取请求的文档:
NSFetchRequest *request = [Product MR_requestAllInContext:privateQueueContext];
//update batch size here
MagicalRecord在内部设置了批量大小,但如果您需要更改它,这就是您实现此目的的方式。