Я создал свой собственный подкласс NSOperation, и теперь я хочу, чтобы некоторые его экземпляры запускались параллельно. Как это параллельная работа Я перезаписаныNSOperationQueue waitUntillAllOperationsAreFinished block operations
- (void)start {
[self willChangeValueForKey:@"isExecuting"];
isExecuting = YES;
[self didChangeValueForKey:@"isExecuting"];
error=NO;
startedSection=NO;
// start the task
[task launch];
}
- (BOOL)isConcurrent {
return YES;
}
- (BOOL)isExecuting {
return isExecuting;
}
- (BOOL)isFinished {
return isFinished;
}
и следующий код выполняется при завершении операции:
[self willChangeValueForKey:@"isExecuting"];
[self willChangeValueForKey:@"isFinished"];
isExecuting = NO;
isFinished = YES;
[self didChangeValueForKey:@"isExecuting"];
[self didChangeValueForKey:@"isFinished"];
Когда я добавляю [myQueue waitUntillAllOperationsAreFinished]
после добавления операции в myQueue
ни одна из операций даже начинается! Когда я удаляю [myQueue waitUntillAllOperationsAreFinished]
, я получаю то, что хочу, за исключением того, что это может привести к некоторым ошибкам из-за основного потока, мешающего этим операциям ...
На самом деле я ничего не реализовал ... Не следует ли работать над новым потоком, отличным от основного? – Nickkk
Вы перепробовали '-isConcurrent', чтобы вернуть' YES'. Это означает, что вы * принимаете на себя ответственность за его запуск одновременно. Вы должны делать это только в том случае, если у вас есть особые требования. Терминология несколько запутанна. Подумайте об этом скорее как параллельное == асинхронное, неконкурентное == синхронное. «Легкий» путь заключается в том, чтобы оставить ваши операции неконкурентными/синхронными. В этом случае операция * очередь * организует вызов операции в потоке, который управляет очередью. Операция будет выполняться одновременно с другими операциями, но синхронно с точки зрения очереди. –
Проблема в том, что в моей операции работает NSTask, который выполняется асинхронно, чтобы получить свой вывод ... – Nickkk