Mam kilka NSOperation
s na wykresie zależność:Jak mogę anulować zależności NSOperation?
NSOperation *op1 = ...;
NSOperation *op2 = ...;
[op2 addDependency:op1];
Oto jak ja ich trwania:
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue addOperation:op1];
[queue addOperation:op2];
Teraz muszę je anulować. W jaki sposób mogę anulować wszystkie NSOperation
s na wykresie zależności i czy żadne inne NSOperation
s nie zostaną anulowane?
co próbowałem:
Wywołanie cancel
po obu NSOperation
nie anulować drugi (o ile mogę powiedzieć):
[op1 cancel]; // doesn't cancel op2
// -- or --
[op2 cancel]; // doesn't cancel op1
Anulowanie kolejkę również anulować operacje, które nie są częścią wykresu zależności od op1
i op2
(jeśli w kolejce są jakieś takie operacje):
[queue cancelAllOperations];
Rozwiązałem to za pomocą niestandardowej metody, która rekurencyjnie przegląda zależności między NSOperation
i anuluje je. Jednak nie jestem zadowolony z tego rozwiązania, ponieważ czuję, że walczę ramy:
- (void)recursiveCancel:(NSOperation *)op
{
[op cancel];
for (NSOperation *dep in op.dependencies)
{
[self recursiveCancel:op];
}
}
Gotcha, +1. Mogę spróbować upewnić się, że wszystkie 'NSOperation's z tego samego wykresu zależności zostaną dodane do tego samego' NSOperationQueue' (i upewnić się, że nic innego nie jest w tej kolejce), tak żebym mógł po prostu wywołać '[queue cancelAllOperations]'. –
Jeśli utworzyłeś nową 'NSOperationQueue' dla każdej grupy' NSOperation's, które chcesz anulować jednocześnie, możesz użyć właściwości 'underlyingQueue', aby umieścić je w tej samej kolejce systemowej. 'NSOperationQueue' nadal będzie tylko anulować operacje, o których wie, nawet jeśli działa na tym samym' dispatch_queue_t' jak inne. –
Z dokumentacji NSOperationQueue: Anulowanie operacji powoduje, że operacja ignoruje wszelkie zależności, jakie może ona mieć.Takie zachowanie umożliwia kolejce wykonanie metody uruchamiania operacji tak szybko, jak to możliwe. Metoda startowa z kolei przenosi operację do stanu gotowego, aby można ją było usunąć z kolejki. To jednak nie działa. – Brett