BFTask对我很好,但我有一个抱怨:我还没有看到一个关于如何cancel任务的工作示例。关于这个主题的全部文档都是在他们的GitHub页面上找到的,只有一个简单的部分,其中包含了所有内容,但我关心的部分是:如何取消任务。
// Somewhere else.
MYCancellationToken *cancellationToken = [[MYCancellationToken alloc] init];
[obj doSomethingComplicatedAsync:cancellationToken];
// When you get bored...
[cancellationToken cancel];他们的代码片段后面跟着:
注意:取消令牌实现应该是线程安全的.
我想知道以下几点:
BFTask接口本身上提供BFTask方法,这有什么好的理由吗?它们具有一个属性,表示任务是否已取消,但无法取消任务。cancellationToken(s)属性包含在BFTask本身上?cancel的实现是否强耦合到任务本身?或者是可能的通用实现,如cancelAllOperations的NSOperationQueue发布于 2015-07-10 21:09:20
BFTask是未来与承诺构造的实现:
“未来是一个变量的只读占位符视图,而承诺是一个可写的单个赋值容器,它设置了未来的值”。
基本上,BFTask是一个Future:它是一个变量的只读占位符视图。
BFTaskCompletionSource是一种承诺:它是一个可写的单个赋值容器,它设置了未来的值。(或错误-或取消任务)
BFTask公共接口仍然是只读的,因此它不允许直接取消它。BFCancellationToken令牌只存储一个状态,BFTask可以检查这个状态。异步任务代码基本上可以定期检查cancellationRequested设置为true,这允许手动取消任务。注意: Bolts 文档说:“任务有点像JavaScript的承诺”,这可能会让人感到困惑,因为它确实是一个未来。我认为它只是在它的Javascript起源上被命名错了。
发布于 2016-03-18 02:36:20
在Bolts中有一个相当有用的取消令牌的实现,但出于某种原因,它在头文件之外完全没有文档记录。关键是BFCancellationTokenSource的使用。您需要保留对BFCancellationTokenSource的引用,以便发出和取消BFCancellationToken。
在我的示例中,我有一个名为cancellableFunction()的特殊函数,它连续地发出一系列任务。如果在上次调用完成之前再次调用该函数,我希望取消上一次调用的未完成任务。
这里的关键是将token传递到每个continueWith函数调用中。如果在任何时候token通过tokenSource被取消,未到达的successBlock将不会被执行。您还可以通过task.cancelled在每个BFContinuationBlock中检查取消状态(在成功块中显然是假的)。
下面是一个示例:
class ViewController: UIViewController {
...
// instance reference to tokenSource so that it can be cancelled by any function in the ViewController
var tokenSource: BFCancellationTokenSource?
...
func cancellableFunction() -> BFTask {
// First cancel the previous token
tokenSource?.cancel()
// Replace the previous TokenSource with a new one
tokenSource = BFCancellationTokenSource()
// Issue new Token from the new TokenSource
let token = tokenSource!.token
return functionThatReturnsBFTask().continueWithSuccessBlock({ (task:BFTask) -> AnyObject? in
...
return nil
}, cancellationToken: token).continueWithExecutor(BFExecutor.mainThreadExecutor(), successBlock: { (task:BFTask) -> AnyObject? in
...
return nil
}, cancellationToken: token).continueWithBlock({ (task:BFTask) -> AnyObject? in
// Here you can perform an actions you want to take on cancellation
if task.cancelled {
}
...
return nil
}, cancellationToken: token)
}
...
}发布于 2015-11-21 12:57:50
使用[self.bfTaskCancelationToken cancel];代码取消系列BFTask
寄存器BFCancellationTokenSource
self.bfTaskCancelationToken = [BFCancellationTokenSource cancellationTokenSource];
[self.bfTaskCancelationToken.token registerCancellationObserverWithBlock:^{
NSLog(@"task hasbeen Cancelled.....");
//Do stuff on cancelation task
} ];工具系列BFTask
注意:在cancellationToken:self.bfTaskCancelationToken.token之后有[task continueWithBlock:^id(BFTask *task)代码
[[[self showAlertProgressHud] continueWithBlock:^id(BFTask *taskLog) {
BFTask *task = [BFTask taskWithResult:nil];
for (int i=0; i<self.arrAssetPhotos.count; i++) {
AIAssetPhoto *assetPhoto = self.arrAssetPhotos[i];
task = [task continueWithBlock:^id(BFTask *task) {
// Return a task that will be marked as completed.
return [self processOnAssetPhoto:assetPhoto index:i completion:NULL];
} cancellationToken:self.bfTaskCancelationToken.token];
}
return task;
}] continueWithBlock:^id(BFTask *task) {
// all asset photos process are done.
return nil;
}];如何取消连续BFtask?
//just by calling one simple method
[self.bfTaskCancelationToken cancel];https://stackoverflow.com/questions/30797473
复制相似问题