2012-05-27 3 views
0

Я создал свой собственный подкласс 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], я получаю то, что хочу, за исключением того, что это может привести к некоторым ошибкам из-за основного потока, мешающего этим операциям ...

ответ

0

Как реализуется параллелизм операций? Я подозреваю, что вы отправляете вещи в основной поток, и вы также блокируете основной поток в -waitUntillAllOperationsAreFinished. Это, конечно, тупик.

+0

На самом деле я ничего не реализовал ... Не следует ли работать над новым потоком, отличным от основного? – Nickkk

+0

Вы перепробовали '-isConcurrent', чтобы вернуть' YES'. Это означает, что вы * принимаете на себя ответственность за его запуск одновременно. Вы должны делать это только в том случае, если у вас есть особые требования. Терминология несколько запутанна. Подумайте об этом скорее как параллельное == асинхронное, неконкурентное == синхронное. «Легкий» путь заключается в том, чтобы оставить ваши операции неконкурентными/синхронными. В этом случае операция * очередь * организует вызов операции в потоке, который управляет очередью. Операция будет выполняться одновременно с другими операциями, но синхронно с точки зрения очереди. –

+0

Проблема в том, что в моей операции работает NSTask, который выполняется асинхронно, чтобы получить свой вывод ... – Nickkk

Смежные вопросы