Objective c 复合操作。这是个坏主意吗?
对于我正在处理的iOS4.X应用程序,我们通常需要执行HTTP请求,然后解析结果,并对结果进行处理,等等 为此,我创建了一个NSOperation类,以允许使用NSOperation队列组合NSOperations。使用NSOperationQueues处理像这样的小事情有什么问题吗。有人告诉我,排队应该是一件更持久的事情 我不希望嵌套在应用程序中的深度超过2级 以下是此类用法的一个示例:Objective c 复合操作。这是个坏主意吗?,objective-c,ios4,Objective C,Ios4,对于我正在处理的iOS4.X应用程序,我们通常需要执行HTTP请求,然后解析结果,并对结果进行处理,等等 为此,我创建了一个NSOperation类,以允许使用NSOperation队列组合NSOperations。使用NSOperationQueues处理像这样的小事情有什么问题吗。有人告诉我,排队应该是一件更持久的事情 我不希望嵌套在应用程序中的深度超过2级 以下是此类用法的一个示例: @implementation CompositeOperation - (id)initWithOpe
@implementation CompositeOperation
- (id)initWithOperations:(NSArray *)operations {
if ((self = [super init])) {
operations_ = [operations retain];
[[operations_ lastObject] addObserver:self forKeyPath:@"isFinished" options:NSKeyValueObservingOptionNew context:nil];
}
return self;
}
-(void)dealloc {
[operations_ release];
[operationQueue_ release];
[super dealloc];
}
- (BOOL)isConcurrent {
return YES;
}
@synthesize isExecuting = isExecuting_;
@synthesize isFinished = isFinished_;
@synthesize operations = operations_;
- (void) start {
if (![self isCancelled]) {
operationQueue_ = [[NSOperationQueue alloc] init];
// TODO: Add code to execute this serially
[operationQueue_ addOperations:operations_ waitUntilFinished:NO];
}
}
- (void)cancel {
if (operationQueue_) {
[operationQueue_ cancelAllOperations];
}
[super cancel];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if ([keyPath isEqualToString:@"isFinished"] && object == [operations_ lastObject]) {
[self setIsFinished:YES];
}
}
@end
谢谢,
迈克我认为这是一个非常好的主意,所以我甚至在它之后创建了图书馆: 有两种操作:由
COSimpleOperation
对象表示的简单操作和由COCompositeOperation
对象表示的复合操作
简单操作是最小的可能单位-引用文档:
简而言之,COSimpleOperation是一种NSOperation,上面加了一点方便糖。作为复合操作的操作单元,它通常对应于一个网络请求或一些小的重点工作
复合操作是由子操作组成的操作。引用@mikelikespie:
该对象的目的是使其能够表示逻辑上分组为一个操作的多个操作
…这几乎是四人帮设计模式中对复合设计模式的另一种描述
复合操作可以是并行
或顺序
并行操作的创建与所讨论的代码示例相同:
NSArray *operations = @[
operation1, operation2, operation3
]; // each operation is NSOperation <COOperation> *
COCompositeOperation *parallelOperation = [[COCompositeOperation alloc] initWithOperations:operations];
NSArray*操作=@[
操作1、操作2、操作3
]; // 每个操作都是NSO操作*
COCompositeOperation*parallelOperation=[[COCompositeOperation alloc]initWithOperations:operations];
要创建顺序操作,应实例化与符合COSequence
协议的对象的协同操作:
顺序组合意味着顺序流:子操作一个接一个地连续执行。排序是通过COCompositeOperation和符合COSequence协议的任意类之间的协作来实现的,COSequence协议由复合操作作为代理来使用,该代理决定哪些操作以及以何种顺序运行这些操作
为了使这种操作组合成为可能,我需要对操作库的工作设置一些限制:除了NSOperations之外,COSimpleOperation和COCompositeOperation都符合
协议:
这种一致性基本上意味着两个操作在完成时都有3种可能的状态:
对我来说,这个库背后的rational“只是”能够表示操作,以便“将它们逻辑地分组为一个操作”。有一些库实现了同样的更高级别的功能,但同时它们引入了一些概念,如:信号或承诺,这些我并不真正需要或我会说不同意。我想要一些尽可能简单的东西,并且基于良好的、古老的、众所周知的NSOperation/NSOperationQueue基础设施,所以这就是整个工作的重点
另外,我希望这种回答符合实际情况,至少它与@mikelikespie在大约4年前提出的问题完全一致。真的没有必要为此单独设置一个类,只需使用NSOperationQueue即可。如果需要等待所有操作完成,请等待队列本身或定期检查队列,或者让最后一个操作不做任何操作,只发送队列已完成的通知。要使队列串行化,只需发送[queue setMaxConcurrentOperationCount:1];Jason:这个对象的目的是使它能够表示逻辑上分组为一个操作的多个操作。我很想知道你是否会将这种方法更新为swift,例如使用generics@algal,这是我非常想做的事情,但我没有找到合适的时间。我很高兴了解你们在这里取得的任何进展。如果你想要第二双眼睛/手,我可以参加。Swift在这方面确实非常有前途,尤其是它的枚举和泛型。