Для приложения iOS4.X, над которым я работаю, нам часто нужно выполнить HTTP-запрос, затем проанализировать результаты и сделать что-то с результатами и так далее.Композитный NSOperation. Это плохая идея?
Для этого я создал класс NSOperation, позволяющий создавать NSOperations с использованием очереди NSOperation. Есть ли проблема с использованием 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
Спасибо, Майк
Нет необходимости создавать отдельный класс для этого, просто используйте NSOperationQueue. Если вам нужно дождаться завершения всех операций, дождитесь самой очереди или проверите ее периодически или просто выполните последнюю операцию, но отправьте уведомление о том, что очередь выполнена. Чтобы сделать очередь очередью, просто отправьте [queue setMaxConcurrentOperationCount: 1]; –
Jason: Цель этого объекта - сделать так, чтобы можно было представлять несколько операций, которые логически сгруппированы как одна операция. – mikelikespie