Objective c 复合操作。这是个坏主意吗?

Objective c 复合操作。这是个坏主意吗?,objective-c,ios4,Objective C,Ios4,对于我正在处理的iOS4.X应用程序,我们通常需要执行HTTP请求,然后解析结果,并对结果进行处理,等等 为此,我创建了一个NSOperation类,以允许使用NSOperation队列组合NSOperations。使用NSOperationQueues处理像这样的小事情有什么问题吗。有人告诉我,排队应该是一件更持久的事情 我不希望嵌套在应用程序中的深度超过2级 以下是此类用法的一个示例: @implementation CompositeOperation - (id)initWithOpe

对于我正在处理的iOS4.X应用程序,我们通常需要执行HTTP请求,然后解析结果,并对结果进行处理,等等

为此,我创建了一个NSOperation类,以允许使用NSOperation队列组合NSOperations。使用NSOperationQueues处理像这样的小事情有什么问题吗。有人告诉我,排队应该是一件更持久的事情

我不希望嵌套在应用程序中的深度超过2级

以下是此类用法的一个示例:

@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种可能的状态:

  • 非空的结果字段表示成功

  • 非空的错误字段表示失败

  • 空的结果和错误字段都表示操作已从外部取消(使用-[NSOperation cancel]方法)

  • 操作的结果和错误字段不能同时为非空

    此约定允许复合操作在某一点决定是继续执行特定的操作组还是停止它。对于没有特定结果的操作,应将[NSNull null]作为结果传递


    对我来说,这个库背后的rational“只是”能够表示操作,以便“将它们逻辑地分组为一个操作”。有一些库实现了同样的更高级别的功能,但同时它们引入了一些概念,如:信号或承诺,这些我并不真正需要或我会说不同意。我想要一些尽可能简单的东西,并且基于良好的、古老的、众所周知的NSOperation/NSOperationQueue基础设施,所以这就是整个工作的重点


    另外,我希望这种回答符合实际情况,至少它与@mikelikespie在大约4年前提出的问题完全一致。

    真的没有必要为此单独设置一个类,只需使用NSOperationQueue即可。如果需要等待所有操作完成,请等待队列本身或定期检查队列,或者让最后一个操作不做任何操作,只发送队列已完成的通知。要使队列串行化,只需发送[queue setMaxConcurrentOperationCount:1];Jason:这个对象的目的是使它能够表示逻辑上分组为一个操作的多个操作。我很想知道你是否会将这种方法更新为swift,例如使用generics@algal,这是我非常想做的事情,但我没有找到合适的时间。我很高兴了解你们在这里取得的任何进展。如果你想要第二双眼睛/手,我可以参加。Swift在这方面确实非常有前途,尤其是它的枚举和泛型。