1

我想使用NSOperationQueue. 我有几个不同的请求将由代码的不同部分添加到队列中,其中一个将比另一个更经常地运行。

我已经使用 GCD 实现了这个,所以我有代码块,因此我打算简单地使用该NSBlockOperation方法blockOperationWithBlock:^{...}而不是创建NSOperation.

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

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

我能想到的选项是:

  1. 子类NSOperation为每种请求类型创建自定义对象,然后对从operations属性检索到的对象使用自省
  2. 子类化NSBlockOperation并添加描述属性

我是否错过了其他一些明显的方法来做到这一点?

4

3 回答 3

2

添加一个保存最新requestA操作的实例变量。在块的末尾清除它requestA。例如

_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的作为依赖,如果还有一个要使用的话。

于 2012-10-18T21:42:11.517 回答
1

你可以使用优先级。

[NSBlockOperation setPriority:NSOperationQueuePriority]

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

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

于 2012-10-18T21:35:26.717 回答
0

我想说正确的方法是对 NSOperation 或 NSBlockOperation 进行子类化,并在这个子类中实现一个-(BOOL)isEqual:(id)object方法,以便您可以比较在 NSOperationQueue 的操作属性中找到的操作。这样你应该能够使用内置[operationA addDependency:operationB];

于 2013-05-02T11:13:41.360 回答