从我一直在阅读的关于大部分未记录的内容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];
}];
我会很感激任何关于我做错了什么的想法,或者如果我可以尝试其他一些可能更合适的方法。提前致谢。