首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实现可以在螺栓框架(BFTask)中取消的任务

实现可以在螺栓框架(BFTask)中取消的任务
EN

Stack Overflow用户
提问于 2015-06-12 07:21:36
回答 3查看 2.8K关注 0票数 7

BFTask对我很好,但我有一个抱怨:我还没有看到一个关于如何cancel任务的工作示例。关于这个主题的全部文档都是在他们的GitHub页面上找到的,只有一个简单的部分,其中包含了所有内容,但我关心的部分是:如何取消任务。

代码语言:javascript
复制
// Somewhere else.
MYCancellationToken *cancellationToken = [[MYCancellationToken alloc] init];
[obj doSomethingComplicatedAsync:cancellationToken];

// When you get bored...
[cancellationToken cancel];

他们的代码片段后面跟着:

注意:取消令牌实现应该是线程安全的.

我想知道以下几点:

  1. 他们可能没有在BFTask接口本身上提供BFTask方法,这有什么好的理由吗?它们具有一个属性,表示任务是否已取消,但无法取消任务。
  2. 是否有充分的理由不将cancellationToken(s)属性包含在BFTask本身上?
  3. cancel的实现是否强耦合到任务本身?或者是可能的通用实现,如cancelAllOperationsNSOperationQueue
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-07-10 21:09:20

  1. 您可能知道,BFTask未来与承诺构造的实现: “未来是一个变量的只读占位符视图,而承诺是一个可写的单个赋值容器,它设置了未来的值”。 基本上,BFTask是一个Future:它是一个变量的只读占位符视图。 BFTaskCompletionSource是一种承诺:它是一个可写的单个赋值容器,它设置了未来的值。(或错误-或取消任务) BFTask公共接口仍然是只读的,因此它不允许直接取消它。
  2. 这与前面的问题有相同的答案: BFTask是只读的,代表只读值。公开取消令牌将允许您操作任务,这与其本质是矛盾的。
  3. 让我们来看看它:https://github.com/BoltsFramework/Bolts-iOS/blob/master/Bolts/Common/BFCancellationToken.m -- BFCancellationToken令牌只存储一个状态,BFTask可以检查这个状态。异步任务代码基本上可以定期检查cancellationRequested设置为true,这允许手动取消任务。

注意: Bolts 文档说:“任务有点像JavaScript的承诺”,这可能会让人感到困惑,因为它确实是一个未来。我认为它只是在它的Javascript起源上被命名错了。

票数 7
EN

Stack Overflow用户

发布于 2016-03-18 02:36:20

在Bolts中有一个相当有用的取消令牌的实现,但出于某种原因,它在头文件之外完全没有文档记录。关键是BFCancellationTokenSource的使用。您需要保留对BFCancellationTokenSource的引用,以便发出和取消BFCancellationToken

在我的示例中,我有一个名为cancellableFunction()的特殊函数,它连续地发出一系列任务。如果在上次调用完成之前再次调用该函数,我希望取消上一次调用的未完成任务。

这里的关键是将token传递到每个continueWith函数调用中。如果在任何时候token通过tokenSource被取消,未到达的successBlock将不会被执行。您还可以通过task.cancelled在每个BFContinuationBlock中检查取消状态(在成功块中显然是假的)。

下面是一个示例:

代码语言:javascript
复制
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)
   }

   ...

}
票数 7
EN

Stack Overflow用户

发布于 2015-11-21 12:57:50

使用[self.bfTaskCancelationToken cancel];代码取消系列BFTask

寄存器BFCancellationTokenSource

代码语言:javascript
复制
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)代码

代码语言:javascript
复制
  [[[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?

代码语言:javascript
复制
  //just by calling one simple method 
  [self.bfTaskCancelationToken cancel];
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30797473

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档