如何取消 performBlock:

How to cancel performBlock:

我实施了搜索,对于用户键入的每个新字符,performFetch: 都会在 performBlock: 内启动。如果搜索字符串发生变化,我想取消之前开始的块并重新开始。我该如何取消或至少通知 performBlock: 内的区块?

我现在的示例代码:

[myManagedObjectContext performBlock:^{
        // fetch from background queue
        if([[self fetchedResultsController] performFetch:nil]) {
            // update the view from the main queue
            // don't do this if performBlock already got started again! but how?
            [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                // refresh UI
            }];
        }
    }];

没有API取消一个performBlock。一旦开始,它将一直持续到完成或直到您的代码 returns 来自它。

如果您发现有必要在提取过程中取消提取,请查看 NSAsynchronousFetchRequest,它允许通过 NSProgress 取消。 WWDC 2014 Core Data session

中描述了异步获取请求和取消