Ios 在后台/前台模式下运行冗长的核心数据删除
我有一个很长的核心数据删除任务92k一些奇怪的记录,这需要很长时间才能运行。最初它锁定了UI线程,所以我尝试将调用粘贴到后台线程上。然而,我在模拟器中注意到,当我将应用程序设置为后台时,该任务停止运行 我想知道是否有一个快速的调整,我可以使代码,这样我的删除将继续运行,一旦应用程序已被后台10分钟或多长时间允许运行 当我开始上课时,我会做一个后台队列:Ios 在后台/前台模式下运行冗长的核心数据删除,ios,multithreading,core-data,grand-central-dispatch,Ios,Multithreading,Core Data,Grand Central Dispatch,我有一个很长的核心数据删除任务92k一些奇怪的记录,这需要很长时间才能运行。最初它锁定了UI线程,所以我尝试将调用粘贴到后台线程上。然而,我在模拟器中注意到,当我将应用程序设置为后台时,该任务停止运行 我想知道是否有一个快速的调整,我可以使代码,这样我的删除将继续运行,一旦应用程序已被后台10分钟或多长时间允许运行 当我开始上课时,我会做一个后台队列: backgroundQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACK
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分钟。我希望用户能够将应用程序设置为后台,并且删除过程仍在运行,因为无论后台/前台如何,删除过程都会影响应用程序的响应。在NSManagedObjectContext中执行此任务-performBlock:call。在具有私有队列并发类型的子上下文上执行此操作。这将为您提供异步处理
不要在每次通话时保存上下文
不要在每次调用时更新tableview重载数据、DelterowStatIndexPath。这是一项示范任务。不要更新用户界面
您对tmpIndexPath的使用是一种代码味道。这是将模型任务与视图任务混合的另一个迹象。删除一堆对象纯粹是一项模型任务。编写代码时,假定不存在UI或控制器。只是一个观察-由于您正在调用deleteRowsAtIndexPaths,因此无需调用ReloadDataBegin deleted,这是每个记录的一个子上下文吗?还是一个我不断重复的独生子女背景?都不是。但你很接近。创建一个子上下文。向它发送一个-performBlock,它将迭代所有要删除的对象,然后删除它们。在该块的末尾,保存子上下文。检查结果,除非有外部错误,否则它可能会成功。在块内,就在它结束之前,在主线程上排队一个异步调用,告诉主线程可以更新UI。另外,对于tmpIndexPath=>我所做的是将模型与核心数据分离,因此我手动将数据模型生成到数组中,而不是处理fetchedResultsController。tmpIndexPath将更新对象中的ready for delete标志,因此当我重新生成模型时,它们将被忽略