我有一个非常冗长的核心数据删除任务,有92k个奇怪的记录需要很长时间才能运行。最初它是锁定UI线程所以我试图将调用粘贴在后台线程上。然而,我注意到,在模拟器中,当我对应用程序进行后台处理时,此任务将停止运行。
我想知道是否有一个快速调整我可以编写代码,这样一旦应用程序在10分钟内进行后台处理或者允许它们运行很长时间,我的删除将继续运行。
当我开始上课时,我会建立一个后台队列:
backgroundQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, nil);
然后是时候删除我的对象了
- (void)queueForDelete:(FlightRecording *)flight {
NSError *error = nil;
flight.deleteFlagValue = 1;
[managedObjectContext save:&error];
// Remove flights form Internal table dataStructure
[flightList removeObjectAtIndex:[tmpIndexPath row]];
[[self tableView] deleteRowsAtIndexPaths:@[tmpIndexPath] withRowAnimation:UITableViewRowAnimationFade];
//Queue flight for deletion in the background
dispatch_async(backgroundQueue, ^{
NSLog(@"Adding %@ to deletion Queue", flight.getFileName);
[self deleteFlight:flight];
});
[[self tableView] reloadData];
}
此代码确实使UI更具响应性,但仍需要大约5分钟 - 10分钟(在模拟器中)删除我的对象。我希望用户能够对应用程序进行后台处理并使删除过程仍在运行,因为无论背景/前景如何,它都会对应用程序的响应性产生影响。
答案 0 :(得分:0)
在NSManagedObjectContext
-performBlock:
来电中执行此任务。在具有私有队列并发类型的子上下文中执行此操作。这将为您提供异步处理。
不要在每次通话时保存您的上下文。
请勿在每次通话时更新您的桌面视图(reloadData
,delteRowsAtIndexPaths
)。这是一个模型任务。不要更新UI。
您使用tmpIndexPath
是一种代码味道。这是将模型任务与View任务混合的另一个标志。删除一堆对象纯粹是一个模型任务。编写代码,假设不存在UI或Controller。