Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在后台/前台模式下运行冗长的核心数据删除_Ios_Multithreading_Core Data_Grand Central Dispatch - Fatal编程技术网

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

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

我有一个很长的核心数据删除任务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分钟。我希望用户能够将应用程序设置为后台,并且删除过程仍在运行,因为无论后台/前台如何,删除过程都会影响应用程序的响应。

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

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

不要在每次调用时更新tableview重载数据、DelterowStatIndexPath。这是一项示范任务。不要更新用户界面


您对tmpIndexPath的使用是一种代码味道。这是将模型任务与视图任务混合的另一个迹象。删除一堆对象纯粹是一项模型任务。编写代码时,假定不存在UI或控制器。

只是一个观察-由于您正在调用deleteRowsAtIndexPaths,因此无需调用ReloadDataBegin deleted,这是每个记录的一个子上下文吗?还是一个我不断重复的独生子女背景?都不是。但你很接近。创建一个子上下文。向它发送一个-performBlock,它将迭代所有要删除的对象,然后删除它们。在该块的末尾,保存子上下文。检查结果,除非有外部错误,否则它可能会成功。在块内,就在它结束之前,在主线程上排队一个异步调用,告诉主线程可以更新UI。另外,对于tmpIndexPath=>我所做的是将模型与核心数据分离,因此我手动将数据模型生成到数组中,而不是处理fetchedResultsController。tmpIndexPath将更新对象中的ready for delete标志,因此当我重新生成模型时,它们将被忽略