将NSOperation依赖项添加到NSOperationQueue中已有的操作

时间:2012-10-18 19:01:32

标签: objective-c ios multithreading nsoperation nsoperationqueue

我想使用NSOperationQueue实现一些后台网络请求。我有几个不同的请求将被代码的不同部分添加到队列中,其中一个将比另一个更频繁地运行。

我已经使用GCD实现了这一点,因此我有代码块,因此我计划简单地使用NSBlockOperation方法blockOperationWithBlock:^{...}而不创建NSOperation的子类。

这个问题是我想在请求之间创建依赖关系。如果队列已经有NSBlockOperation的requestA,那么我想在为requestB创建NSBlockOperation时为其添加依赖关系。在同时创建操作时这很简单,但我找不到一种简单的方法来确定队列中已存在的操作。

NSOperationQueue具有operations属性,因此我可以自行检索操作列表,但如何确定哪个操作是哪个?我没有看到可以使用的名称/描述属性。

我能想到的选择是:

  1. 子类NSOperation为每个请求类型创建自定义对象,然后对从operations属性
  2. 检索到的对象使用内省
  3. 子类NSBlockOperation并添加描述属性
  4. 我错过了其他一些明显的方法吗?

3 个答案:

答案 0 :(得分:2)

添加一个包含最新requestA操作的实例变量。在requestA块的末尾清除它。 E.g。

_requestA = [NSBlockOperation blockOperationWithBlock:^{
    // Normal requestA code here.
    // ...

    // Assuming you create all requestA and requestB instances on the main thread...
    dispatch_async(dispatch_get_main_queue(), ^{ _requestA = nil; });
}];

然后,当您创建requestB时,如果还有一个要使用,则可以将最新的requestA作为依赖项。

答案 1 :(得分:1)

您可以使用优先级。

[NSBlockOperation setPriority:NSOperationQueuePriority]

https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/NSOperation_class/Reference/Reference.html

然后,当您枚举操作时,您可以检查优先级并将它们作为依赖项添加。您甚至可能不需要检查它们,只需适当地设置操作的优先级。

答案 2 :(得分:0)

我想说正确的方法是继承NSOperation或NSBlockOperation,并在此子类中实现-(BOOL)isEqual:(id)object方法,以便您可以比较在NSOperationQueue的operations属性中找到的操作。这样你就可以使用内置[operationA addDependency:operationB];