【问题标题】:NSOperationQueue doesn't stop when [operation cancelAllOperations] is called调用 [operation cancelAllOperations] 时 NSOperationQueue 不会停止
【发布时间】:2014-05-29 09:58:49
【问题描述】:

我在我的 iOS 应用中创建了这个队列,我想停止它:

在我的 .h 文件中:

NSOperationQueue *uhm;

在我的 .m 文件中: 在 viewDidLoad 中:NSOperationQueue *uhm = [[NSOperationQueue alloc] init];

在我的方法中:

[uhm addOperation:[NSBlockOperation blockOperationWithBlock: ^{
        … //Here I do operations that retrive data from my server
        [[NSOperationQueue mainQueue] addOperationWithBlock: ^{
            [self.tableView reloadData];
        }];
    }
    }]];

但是当我调用[uhm cancelAllOperations] 时,它只是将布尔值isCancelled 设置为YES,但不会停止队列的执行! 请帮帮我!

【问题讨论】:

  • 这就是它的工作原理。您必须对操作进行编程以检查 isCancelled

标签: ios objective-c xcode nsoperation nsoperationqueue


【解决方案1】:

取消操作实际上并不会停止任何正在执行的操作。

它只是阻止新的启动。

您必须在操作本身中手动停止任何当前操作。

例如,如果您有收集下载数据的代码,那么在连接数据之前检查操作是否被取消。

如果操作被取消,则结束操作。

有很多方法可以做到这一点。这取决于您的操作内部是什么。

【讨论】:

  • 我想到了,但我该怎么做呢?
  • @Pinturikkio 这完全取决于您如何编写操作代码。啊...您已经将其作为“addOperationWithBlock”完成了,您实际上无法对它们做太多事情。我建议继承 NSOperation 并这样做。
  • 在我的操作块中,我只是简单地执行我编写的操作,并在哪里放置我所做的 cmets 行,例如 myString = @"..."; .我的目标是在执行时调用相同的方法
  • 是的,你真的应该创建一个 NSOperation 的子类,并在那里有你的下载代码。然后,每当您获得更新时,您都可以检查isCancelled 状态并在必要时停止运行。
【解决方案2】:

就像您提到的那样,您正在从另一个方法调用 cancelAllOperations,而您分配的对象不在您的 .h 中,因此您正在调用另一个与您初始化的“嗡嗡声”不同的对象.

所以尝试声明 NSOperationQueue *uhm;在您的 .h 中,它将是全局的,然后您可以调用 [uhm cancelAllOperations]; .m 中的任何方法都可以。

【讨论】:

  • 对不起,你是对的,这是一个例子,我的 NSOperationQueue 是在 .h 中定义的。
猜你喜欢
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-01
  • 2018-09-10
相关资源
最近更新 更多