我已经扩展NSOperationQueue
以允许添加NSBlockOperation
特定NSString
的作为标识符。
标识符值保存在NSMutableArray
作为注册表的服务中。这就是我实现注册表的方式。
-(void)addOperation:(NSOperation *)operation withID:(NSString*)operationID
{
@synchronized(self.queueReference)
{
[self.queueReference addObject:operationID]; // <-- just a mutable array
}
[operation setCompletionBlock:^(){
@synchronized(self.queueReference) {
[self.queueReference removeObject:operationID];
}
}];
[self addOperation:operation];
}
基本上,我添加了一个完成块,该块在该特定操作完成时清理注册表。
但是,虽然这可行,但我需要向队列添加更多粒度。
我只将队列与块操作一起使用,并且在块执行期间,我可能会NSNotification
根据执行的方式向侦听器发送不同的消息。
我试图实现的目标:
调用者尝试将NSBlockOperation
带有标识符的特定添加到队列中。如果队列已经有这样的标识符,就不要添加块,并且调用类将自己设置为侦听器。
什么不见了 ?检查标识符是不够的,可能存在NSBlockOperation
已经调度NSNotification
但尚未调用完成块的情况。
所以调用者类询问队列,这表示标识符存在于注册表中,调用者错误地将自己设置为监听一个永远不会到达的通知,因为它已经被发送了。
相反的情况是:调用者询问队列,它说'标识符在注册表中'但是NSNotification
被发送了。来电者NSBlockOperation
排队。
注册表的检查是通过一个简单的方法进行的:
-(BOOL)hasOperationWithID:(NSString*)operationID
{
@synchronized(self.queueReference)
{
return [self.queueReference containsObject:operationID];
}
}
但在这一点上,我对如何扩展这种方法不太了解。我正在编写的代码是一种“学术”,它没有任何特定目的,只是我在尝试实验。因此我在代码中有很大的灵活性。但这对我来说是一个相当新的主题,所以请尽可能具体地说明建议实施的任何缺点。