我想使用NSOperationQueue
实现一些后台网络请求。我有几个不同的请求将被代码的不同部分添加到队列中,其中一个将比另一个更频繁地运行。
我已经使用GCD实现了这一点,因此我有代码块,因此我计划简单地使用NSBlockOperation
方法blockOperationWithBlock:^{...}
而不创建NSOperation
的子类。
这个问题是我想在请求之间创建依赖关系。如果队列已经有NSBlockOperation
的requestA,那么我想在为requestB创建NSBlockOperation
时为其添加依赖关系。在同时创建操作时这很简单,但我找不到一种简单的方法来确定队列中已存在的操作。
NSOperationQueue
具有operations
属性,因此我可以自行检索操作列表,但如何确定哪个操作是哪个?我没有看到可以使用的名称/描述属性。
我能想到的选择是:
NSOperation
为每个请求类型创建自定义对象,然后对从operations
属性NSBlockOperation
并添加描述属性我错过了其他一些明显的方法吗?
答案 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]
然后,当您枚举操作时,您可以检查优先级并将它们作为依赖项添加。您甚至可能不需要检查它们,只需适当地设置操作的优先级。
答案 2 :(得分:0)
我想说正确的方法是继承NSOperation或NSBlockOperation,并在此子类中实现-(BOOL)isEqual:(id)object
方法,以便您可以比较在NSOperationQueue的operations属性中找到的操作。这样你就可以使用内置[operationA addDependency:operationB];