Если есть явные зависимости между операциями, а затем использовать addDependency
:
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
queue.maxConcurrentOperationCount=1;
NSOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{
[someObject someSelector];
}];
NSOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{
[someObject anotherSelector];
}];
[operation2 addDependency:operation1];
[queue addOperation:operation1];
[queue addOperation:operation2];
Если ваши операции делают асинхронной активности, то вы должны определить пользовательские операции и вызывать только completeOperation
(который будет сообщение isFinished
), когда выполняется асинхронная задача).
// SomeOperation.h
#import <Foundation/Foundation.h>
@interface SomeOperation : NSOperation
@end
и
// SomeOperation.m
#import "SomeOperation.h"
@interface SomeOperation()
@property (nonatomic, readwrite, getter = isFinished) BOOL finished;
@property (nonatomic, readwrite, getter = isExecuting) BOOL executing;
@end
@implementation SomeOperation
@synthesize finished = _finished;
@synthesize executing = _executing;
#pragma Configure basic operation
- (id)init
{
self = [super init];
if (self) {
_finished = NO;
_executing = NO;
}
return self;
}
- (void)start
{
if ([self isCancelled]) {
self.finished = YES;
return;
}
self.executing = YES;
[self main];
}
- (void)completeOperation
{
self.executing = NO;
self.finished = YES;
}
- (void)main
{
// start some asynchronous operation
// when it's done, call `completeOperation`
}
#pragma mark - Standard NSOperation methods
- (BOOL)isConcurrent
{
return YES;
}
- (void)setExecuting:(BOOL)executing
{
[self willChangeValueForKey:@"isExecuting"];
_executing = executing;
[self didChangeValueForKey:@"isExecuting"];
}
- (void)setFinished:(BOOL)finished
{
[self willChangeValueForKey:@"isFinished"];
_finished = finished;
[self didChangeValueForKey:@"isFinished"];
}
@end
Таким образом, с помощью следующего кода, он не начнет operation2
до асинхронная задача инициируется в main
в SomeOperation
объекта, operation1
, не вызывает его метод completeOperation
.
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
queue.maxConcurrentOperationCount=1;
NSOperation *operation1 = [[SomeOperation alloc] init];
NSOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{
[someObject anotherSelector];
}];
[operation2 addDependency:operation1];
[queue addOperation:operation1];
[queue addOperation:operation2];
Я все еще не совсем понимаю. Что мне делать с моим кодом, чтобы гарантировать FIFO? – JoshDG
Я думаю, что вы должны установить операционные зависимости, чтобы гарантировать порядок операций. –
Просто использование 'addDependency' будет выполнять задание, если ни один из этих методов не выполняет ничего, что есть, сам, работает асинхронно, и в этом случае вы, вероятно, захотите использовать подкласс NSOperation. – Rob