冗长的核心数据删除在后台/前台模式下运行

时间:2014-07-16 09:54:18

标签: ios multithreading core-data grand-central-dispatch

我有一个非常冗长的核心数据删除任务,有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分钟(在模拟器中)删除我的对象。我希望用户能够对应用程序进行后台处理并使删除过程仍在运行,因为无论背景/前景如何,它都会对应用程序的响应性产生影响。

1 个答案:

答案 0 :(得分:0)

NSManagedObjectContext -performBlock:来电中执行此任务。在具有私有队列并发类型的子上下文中执行此操作。这将为您提供异步处理。

不要在每次通话时保存您的上下文。

请勿在每次通话时更新您的桌面视图(reloadDatadelteRowsAtIndexPaths)。这是一个模型任务。不要更新UI。

您使用tmpIndexPath是一种代码味道。这是将模型任务与View任务混合的另一个标志。删除一堆对象纯粹是一个模型任务。编写代码,假设不存在UI或Controller。