我正在使用 Core Data 开发 iOS 应用程序,我从 Core Data 异步获取结果。我需要找到一种方法来实现此提取的取消功能,以防用户决定他们已经等待太久,并希望在中途取消提取。我知道使用 NSProgress 在 iOS 8 中使用 Core Data 是可能的,但我找不到有关如何执行此操作的任何示例或示例代码。
这是我的示例获取方法:
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"MyObject"];
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"read == %@", @(NO)];
NSPersistentStoreAsynchronousFetchResultCompletionBlock resultBlock = ^(NSAsynchronousFetchResult *result) {
NSLog(@"Number of Unread Items: %ld", (long)result.finalResult.count);
[result.progress removeObserver:self
forKeyPath:@"completedUnitCount"
context:ProgressObserverContext];
[result.progress removeObserver:self
forKeyPath:@"totalUnitCount"
context:ProgressObserverContext];
};
NSAsynchronousFetchRequest *asyncFetch = [[NSAsynchronousFetchRequest alloc]
initWithFetchRequest:fetchRequest
completionBlock:resultBlock];
[context performBlock:^{
//Assumption here is that we know the total in advance and supply it to the NSProgress instance
NSProgress *progress = [NSProgress progressWithTotalUnitCount:preComputedCount];
[progress becomeCurrentWithPendingUnitCount:1];
NSAsynchronousFetchResult *result = (NSAsynchronousFetchResult *)[context
executeRequest:asyncFetch
error:nil];
[result.progress addObserver:self
forKeyPath:@"completedUnitCount"
options:NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNew
context:ProgressObserverContext];
[result.progress addObserver:self
forKeyPath:@"totalUnitCount"
options:NSKeyValueObservingOptionOld|NSKeyValueObservingOptionNew
context:ProgressObserverContext];
[progress resignCurrent];
}];
我意识到通过使用 NSProgress 取消我的获取,我通过了 NSUserCancelled 错误,但是我想再看一个如何完成此操作的示例。