【发布时间】:2012-12-19 10:32:38
【问题描述】:
我已扩展 NSOperationQueue 以允许添加带有特定 NSString 作为标识符的 NSBlockOperation。
标识符值保存在用作注册表的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];
}
}
但在这一点上,我对如何扩展这种方法并没有太多想法。我正在编写的代码有点“学术”,它没有任何特定目的,只是我在尝试实验。因此我在代码中有很大的灵活性。但这对我来说是一个相当新的主题,所以请尽可能具体地说明建议实施的任何缺点。
【问题讨论】:
标签: objective-c nsoperationqueue nsnotifications nsblockoperation