4

从我一直在阅读的关于大部分未记录的内容NSAsynchronousFetchRequest来看,它应该是可以取消的。在来自 WWDC 2014 的 Apple 视频“核心数据中的新功能”中,有一个正在完成的示例(大约 17:40)。但是我在任何地方都没有找到应该如何做到这一点。

我已经尝试将其设置为在新的提取进入时取消提取,但我似乎一直未能成功地让它工作。我说“看似”的原因是因为当我调试代码时,它会遇到NSAsyncronousFetchResult'NSProgress属性的取消方法(而属性不是nil)。但是,在之前的几次提取被“取消”后,应用程序会冻结大约执行所有提取所需的时间。因此,似乎并没有取消提取。这是我试图取消提取的内容:

if (self.asyncFetchResult) {
    [self.asyncFetchResult.progress cancel];
}

NSFetchRequest* fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"OfflineFeature"];
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"layers.layerName in %@ AND xMax >= %lf AND xMin <= %lf AND yMax >= %lf AND yMin <=%lf", allLayerNames, bufferedEnvelope.xmin,bufferedEnvelope.xmax,bufferedEnvelope.ymin,bufferedEnvelope.ymax];

NSAsynchronousFetchRequest* asyncFetchRequest = [[NSAsynchronousFetchRequest alloc] initWithFetchRequest:fetchRequest completionBlock:^(NSAsynchronousFetchResult* result) {
    if (![result.progress isCancelled]) {
        allFeatures = result.finalResult;
        dispatch_async(dispatch_get_main_queue(), ^{
            //Bunch of code to use the results
        });
    }
}];

MVAppDelegate* appDelegate = (MVAppDelegate*)[[UIApplication sharedApplication] delegate];
__weak typeof(self) weakSelf = self;

[appDelegate.managedObjectContext performBlock:^{
    NSProgress* progress = [NSProgress progressWithTotalUnitCount:1];
    [progress becomeCurrentWithPendingUnitCount:1];
    NSError* error;
    weakSelf.asyncFetchResult = [appDelegate.managedObjectContext executeRequest:asyncFetchRequest error:&error];
    if (error) {
        NSLog(@"Error performing asynchronous fetch request.\n%@", error);
    }
    [progress resignCurrent];
}];

我会很感激任何关于我做错了什么的想法,或者如果我可以尝试其他一些可能更合适的方法。提前致谢。

4

0 回答 0